Why in Groovy, when I create 2 lists, is there any difference if I do a.intersect (b) and b.intersect (a):
def list1 = ["hello", "world", "world"]; def list2 = ["world", "world", "world"]; println( "Intersect list1 with list2: " + list1.intersect( list2 ) ); println( "Intersect list2 with list1: " + list2.intersect( list1) );
traces:
Intersect list1 with list2: [world, world, world] Intersect list2 with list1: [world, world]
(you can copy it here: http://groovyconsole.appspot.com/ if you want to test it)
If all arrays contain unique elements, then this works fine. When you start adding duplicates, it gets weird:
def list1 = ["hello", "world", "test", "test"]; def list2 = ["world", "world", "world", "test"]; println( "Intersect list1 with list2: " + list1.intersect( list2 ) ); println( "Intersect list2 with list1: " + list2.intersect( list1 ) );
traces:
Intersect list1 with list2: [world, world, world, test] Intersect list2 with list1: [world, test, test]
I thought the whole point of intersect() is to give you common elements, so no matter what order you put them in?
If this is not the case, how can I get only common elements (expecting duplicates in an array). For instance. For example, you need to return ["world", "world"] , and example two should return ["world", "test"]
Edit
To clarify a bit, this code should check that the user data is still the same (provided that they are disabled in the middle of something, and we want to make sure that the data has not been changed or is in the same state as before).
The order of the lists cannot be guaranteed (the user can change their order, but he is still technically βthe sameβ), and duplicates are possible.
So, something like: ["one", "one", "two"] should match ["two", "one", "one"] , while any addition to the lists or changing the data should not match.