[
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)