我试图找到两个列表之间的交集。我使用Apache Commons ListUtils.intersection进行了一些测试,并凭经验发现结果中的元素以第二个列表顺序返回。
ListUtils.intersection(asList(1,2,3,4),asList(3,1,2,6,7)
=[3, 1, 2]
此行为是否在未来指定为一致?我找不到任何参考资料。
答案 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
获取