Java ListUtils.intersection中结果列表的顺序

Java ListUtils.intersection中结果列表的顺序,java,algorithm,apache-commons,Java,Algorithm,Apache Commons,我试图找到两个列表之间的交叉点。我用ApacheCommonsListUtils.intersection做了一些测试,根据经验发现结果中的元素以第二个列表顺序返回 ListUtils.intersection(asList(1,2,3,4),asList(3,1,2,6,7) =[3, 1, 2] 是否指定此行为在将来保持一致?我找不到任何参考。诀窍在于实现org.apache.commons.collections.ListUtils.intersection 对于列表的迭代,使用更大的

我试图找到两个列表之间的交叉点。我用ApacheCommonsListUtils.intersection做了一些测试,根据经验发现结果中的元素以第二个列表顺序返回

ListUtils.intersection(asList(1,2,3,4),asList(3,1,2,6,7)

=[3, 1, 2]

是否指定此行为在将来保持一致?我找不到任何参考。

诀窍在于实现org.apache.commons.collections.ListUtils.intersection

对于列表的迭代,使用更大的列表,在您的示例中,列表2比列表1大,因此您总是从列表2获得结果

行为是

如果列表2有更多的元素或相同数量的元素要列出 1然后结果顺序将为列表2顺序

如果列表1的元素多于列表2,则结果顺序 将按列表1的顺序排列

org.apache.commons.collections.ListUtils.intersection的代码片段,这项工作由谁来完成

public static <E> List<E> intersection(final List<? extends E> list1, final List<? extends E> list2) {

final List<E> result = new ArrayList<E>();
    List<? extends E> smaller = list1;
    List<? extends E> larger = list2;
    if (list1.size() > list2.size()) {
        smaller = list2;
        larger = list1;
    }

    final HashSet<E> hashSet = new HashSet<E>(smaller);

    for (final E e : larger) {
        if (hashSet.contains(e)) {
            result.add(e);
            hashSet.remove(e);
        }
    }
    return result;
}

public static List intersection(final List)如果您没有找到任何引用,那么您就不能依赖它。它可能会在将来发生变化,或者在不同的JVM中发生变化,或者取决于所使用的列表类型,以及我没有想到的其他事情。比如“元素……总是以第二个列表顺序返回。”这是一种误导性的思考方式;如果你说“我运行了N个测试,这些测试总是以第二个列表顺序返回结果。”,你的问题几乎可以自己回答。你没有尝试所有的列表组合,或所有大小的列表,或所有JVM,等等@AlexFungjjjaaavvvaaa@arcy你是对的,我编辑了这个问题以删除“always”@jesantana-always在你的示例中应该很好,因为列表2比列表1大t、 请参阅我的答案以了解更多细节。这是操作契约的一部分吗?阅读源代码以了解内部结构,然后根据您了解的内容,这意味着,如果有人更改了该实现,或者您使用了一组满足Java契约和约束但不以相同方式实现的代码,y我们的代码可能会中断。你认为这是谁的错?@arcy-Apache是一组标准库,更改实现的机会非常少。在这种情况下,我们总是需要迭代,直到到达较大列表的最后一个元素,所以我相信实现不应该更改。为交叉点提供的Java文档hod谈到了参数和返回类型。当我进去只看代码时,我得到的结果中更详细地说明了为什么会出现更大的列表顺序的行为,我在任何文档或博客中都找不到这些信息。我的观点是,依赖于实现是一种糟糕的工程,无论你是否认为可能更改与否。这是软件组件之间接口和合同的全部要点。如果您依赖于某个特定订单,而您的库的合同不包括该订单,那么查看“隐藏”并说“哦,看,它这样做了,我看不出它会改变”是糟糕的工程即使不太可能,或者不太可能,只要你负责维护。