ListUtils.intersection中的结果列表顺序

时间:2017-07-20 10:46:26

标签: java algorithm apache-commons

我试图找到两个列表之间的交集。我使用Apache Commons ListUtils.intersection进行了一些测试,并凭经验发现结果中的元素以第二个列表顺序返回。

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

=[3, 1, 2]

此行为是否在未来指定为一致?我找不到任何参考资料。

1 个答案:

答案 0 :(得分:1)

诀窍在于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;
}

List Utils的完整源代码可在此处https://commons.apache.org/proper/commons-collections/apidocs/src-html/org/apache/commons/collections4/ListUtils.html

获取