gpt4 book ai didi

arrays - Groovy:与 a.intersect( b ) 和 b.intersect( a ) 的区别

转载 作者:行者123 更新时间:2023-12-04 11:29:20 25 4
gpt4 key购买 nike

为什么在 Groovy 中,当我创建 2 个列表时,如果我执行 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() 的全部要点是为了给你共同的元素,所以你把它们放在哪个顺序都没有关系?

如果不是这种情况,我怎样才能只获取公共(public)元素(期望数组中的重复项)。例如。示例一应返回 ["world", "world"]示例二应该返回 ["world", "test"]
编辑

为了澄清一点,这段代码应该测试用户数据是否仍然相同(假设他们在某事中间断开连接,我们要确保数据没有被篡改,或者处于与以前相同的状态)。

无法保证列表的顺序(用户可以对其重新排序,但从技术上讲它仍然是“相同的”),并且可能出现重复。

比如: ["one", "one", "two"]应该匹配 ["two", "one", "one"] ,而对列表的任何添加或数据更改都不应该匹配。

最佳答案

如果你看the source for Collection.intersect ,可以看到方法的逻辑遵循这样的流程:

对于两个系列,leftright

  • 交换 leftright如果 left小于 right
  • 添加全部left成一个集合(删除重复)
  • 对于 right 中的每个元素如果它存在于 leftSet ,然后将其添加到结果中

  • 因此,对于您的最后两个示例;
    def array1 = ["hello", "world", "test", "test"]
    def array2 = ["world", "world", "world", "test"]
    array1.intersect( array2 )会给出(如果我们在 Groovy 中编写相同的算法):
    leftSet = new TreeSet( array1 ) // both same size, so no swap
    // leftSet = [ 'hello', 'world', 'test' ]
    right = array2
    result = right.findAll { e -> leftSet.contains( e ) }

    哪个(如果你运行它),你可以看到结果的值是 [world, world, world, test] (如您所见)。这是因为 right 中的每个元素可以在 leftSet 中找到

    不知道为什么第一个示例应该返回 ["world","world"]尽管...

    之后...

    所以,我认为你正在寻找的是这样的:
    def array1 = ["hello", "world", "test", "test"]
    def array2 = ["world", "world", "world", "test"]
    def intersect1 = array1.intersect( array2 ) as TreeSet
    def intersect2 = array2.intersect( array1 ) as TreeSet
    assert intersect1 == intersect2

    为了您处理集合中的重复项,就像 intersect1intersect2将等于
    [test, world]

    后来还是

    我相信这可以满足您的要求:
    [array1,array2]*.groupBy{it}.with { a, b -> assert a == b }

    关于arrays - Groovy:与 a.intersect( b ) 和 b.intersect( a ) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7386978/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com