为什么在Groovy中,当我创建两个列表时,执行a.intersect(b)和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) );
跟踪:
Intersect list1 with list2: [world, world, world]
Intersect list2 with list1: [world, world]
如果所有的数组都包含唯一的元素,那么它将像正常情况一样工作。一旦你开始添加重复的元素,它就会变得奇怪:
(你可以在http://groovyconsole.appspot.com/上复制它以进行测试)
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 ) );
追踪:
Intersect list1 with list2: [world, world, world, test]
Intersect list2 with list1: [world, test, test]
我认为使用 intersect()
方法的整个意图就是为了给你公共元素,所以无论你将它们放在哪个顺序中都没有关系?
如果不是这种情况,我怎样才能仅获取共同的元素(数组中的重复项除外)?例如,示例一应该返回["world", "world"]
,示例二应该返回["world", "test"]
编辑
稍作澄清,此代码应该测试用户数据是否仍然相同(假设他们在某些事情中断开连接,并且我们想确保数据没有被篡改,或者处于与之前相同的状态)。
列表的顺序不能保证(用户可能重新排序它,但在技术上仍然是“相同的”),并且重复项是可能的。
因此,像["one", "one", "two"]
这样的内容应该与["two", "one", "one"]
匹配,而列表中任何添加或数据更改都不应该匹配。
def array1 = ["hello"、"world"、"world"];
并不创建一个数组。它是一个List
(具体来说是一个ArrayList
)! - Joachim Sauer