Hi Regis, >From Java class library side, the behaviour in this case is unspecified.
I believe you hit on the known issue with EUT, please refer to archived Harmony thread [1]. Reading back that thread you might notice that this is the inconsistency in EUT which (by some miracle occasion) works well with RI. There's the Eclipse bug against that submitted [2]. Thanks, Aleksey. [1] http://markmail.org/message/svoktdxopww6sv7p [2] https://bugs.eclipse.org/bugs/show_bug.cgi?id=212583 On Wed, Jan 21, 2009 at 3:06 PM, Regis <[email protected]> wrote: > Hi, > > I track the eut test testAddWorkingSet in org.eclipse.ui.tests, found this > failure was caused by Harmony TreeSet can't remove a element already in the > set. After further investigation, I found the test changed the elements > after added them to set, that corrupt the set, but RI could remove the > element successfully even the set is not ordered. > > Following test demo the scenario: > > public class TestTreeSet { > public static void main(String[] args) { > TreeSet set = new TreeSet(); > Entry temp = new Entry(2); > set.add(new Entry(1)); > set.add(temp); > set.add(new Entry(3)); > set.add(new Entry(4)); > set.add(new Entry(5)); > set.add(new Entry(6)); > temp.setValue(0); > > for (Iterator iterator = set.iterator(); iterator.hasNext();) { > Entry entry = (Entry) iterator.next(); > System.out.println(entry.value); > } > > System.out.println(set.remove(temp)); > } > > public static class Entry implements Comparable { > private int value; > > public Entry(int value) { > this.value = value; > } > > public void setValue(int value) { > this.value = value; > } > > public int getValue() { > return value; > } > > public int compareTo(Object arg0) { > return value - ((Entry) arg0).value; > } > } > > public static class TestComparator implements Comparator { > > public int compare(Object arg0, Object arg1) { > return ((Entry) arg0).getValue() - ((Entry) arg1).getValue(); > } > > } > } > > output of RI: > 1 > 0 > 3 > 4 > 5 > 6 > true > > output of Harmony: > 1 > 0 > 3 > 4 > 5 > 6 > false > > In Harmony, binary search is used to find the element, in this case, the > array is not ordered, so it can't work correctly. From spec: > > "The set will not contain the specified element once the call returns" > > So I think RI's behavior is more reasonable. > > This can be fixed by comparing every element in set when remove, but will > cause performance downgrade, what do you think? Any suggestions/ideas? > > -- > Best Regards, > Regis. >
