[ 
https://issues.apache.org/jira/browse/GROOVY-11127?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17748983#comment-17748983
 ] 

ASF GitHub Bot commented on GROOVY-11127:
-----------------------------------------

merscwog commented on PR #1915:
URL: https://github.com/apache/groovy/pull/1915#issuecomment-1657301906

   In trying to implement and run various symmetric difference tests, I 
discovered what might be considered a bug in the minus() method.  It contains 
this very innocent looking code:
   ```groovy
   answer = new TreeSet<>(comparator);
   answer.addAll(self1);
   answer.removeAll(removeMe1);
   ```
   
   ```groovy
   Set baseValues = ['a', 'B', 'c'].toSet()
   
   Set tree1 = new TreeSet(String.CASE_INSENSITIVE_ORDER)
   tree1.addAll(baseValues)
   tree1.removeAll(['A', 'b'])
   assert tree1 == ['c'] as Set
   
   Set tree2 = new TreeSet(String.CASE_INSENSITIVE_ORDER)
   tree2.addAll(baseValues)
   tree2.removeAll(['A', 'b', 'D'])
   assert tree2 == ['c'] as Set  // this fails...
   ```
   
   The removeAll() method on TreeSet() is actually the one in AbstractSet, 
which has some very unexpected behavior, in that if the removal collection is 
the same length or longer than that initial collection, it flips the 
comparisons (which means that the TreeSet comparator is effectively ignored 

> Add '|', '&', and '^' operators to Set and SortedSet
> ----------------------------------------------------
>
>                 Key: GROOVY-11127
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11127
>             Project: Groovy
>          Issue Type: New Feature
>          Components: groovy-jdk
>            Reporter: Spencer Allain
>            Assignee: Paul King
>            Priority: Trivial
>             Fix For: 5.x
>
>
> Many languages conventionally allow sets to use '|' as union, '&' as 
> intersection, and '^' as symmetric difference operations on sets.
> This ticket is proposing adding these operations as DefaultGroovyMethods for 
> Set and SortedSet such that the below tests should pass:
> {code:java}
> Set a = [1,2,3,4] as Set
> Set b = [3,4,5,6] as Set
> assert (a | b) == [1,2,3,4,5,6] as Set
> assert (a & b) == [3,4] as Set
> assert (a ^ b) == [1,2,5,6] as Set
> Set d = ['a', 'B', 'c'] as Set
> Set e = ['A', 'b', 'D'] as Set
> assert d.and(e, String.CASE_INSENSITIVE_ORDER) == ['a', 'B'] as Set
> assert d.and(e, Comparator.naturalOrder()) == [] as Set
> assert d.xor(e, String.CASE_INSENSITIVE_ORDER) == ['c', 'D'] as Set
> assert d.xor(e, Comparator.naturalOrder()) == ['a', 'B', 'c', 'A', 'b', 'D'] 
> as Set
> {code}
> A  [Pull Request|https://github.com/apache/groovy/pull/1915] exists that 
> implements the desired additions for the 5.x groovy branch (master), but it 
> should be fairly easy to make the functionality available in 4.x if desired.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to