[jira] [Closed] (GROOVY-7158) minus(List, Collection) considers different objects equal if they have equal hashCodes

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[jira] [Closed] (GROOVY-7158) minus(List, Collection) considers different objects equal if they have equal hashCodes

JIRA jira@apache.org

     [ https://issues.apache.org/jira/browse/GROOVY-7158?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

John Wagenleitner closed GROOVY-7158.
-------------------------------------
    Resolution: Fixed
      Assignee: John Wagenleitner

This issue was fixed by the fix for GROOVY-7530 and the [code in question|https://github.com/apache/groovy/blob/6a8232a5ba4fdf89c7c3d1eddba68b909f4a732a/src/main/org/codehaus/groovy/runtime/NumberAwareComparator.java#L53] now compares using {{equals}}.


> minus(List, Collection) considers different objects equal if they have equal hashCodes
> --------------------------------------------------------------------------------------
>
>                 Key: GROOVY-7158
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7158
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-jdk
>            Reporter: motto
>            Assignee: John Wagenleitner
>
> This is essentially a duplicate of GROOVY-4101 and the related ticket GROOVY-4124.
> In [org.codehaus.groovy.runtime.DefaultGroovyMethods.minus(Collection<T> self, Collection<?> removeMe)|https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java#L10048]
> {noformat}
> Comparator<T> numberComparator = new NumberAwareComparator<T>();
> ...
> if (numberComparator.compare(element, (T)elt) == 0) {
>   iter.remove();
>   elementRemoved = true;
> }
> {noformat}
> objects not implementing [Comparable|http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html] and without a compareTo method are compared using the [NumberAwareComparator|https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/NumberAwareComparator.java#L37]
> {noformat}
>  // since the object does not have a valid compareTo method
> // we compare using the hashcodes. null cases are handled by
> // DefaultTypeTransformation.compareTo
> int x1 = o1.hashCode();
> int x2 = o2.hashCode();
> if (x1 == x2) return 0;
> if (x1 < x2) return -1;
> return 1;
> {noformat}
> which incorrectly removes unequal objects from the original collection.
> This is exceedingly frustrating because the results are therefore sporadic and supposedly resolved according to GROOVY-4101 and GROOVY-4124. After a fair amount of head scratching and debugging (on more than 1 occasion) I went looking at the sources on github and it appears the patch has never made it into master. Is it possible the patch was deemed unfit? Was it forgotten about? Is this something I should fix myself?



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)
Loading...