我有两个列表。 “ idOrderList”中的插入顺序也是“ idAndIndexList”所需的排序顺序。我在代码中将列表与下面的内容相交。
{
List<String> idOrderList; //insertion order in this list is sort order
List<Pair<String,Integer>> idAndIndexList;
//List intersection is done as below
List resultList =
idOrderList.stream().filter(
new HashSet<>(idAndIndexList.stream()
.flatMap(o -> Stream.of(o.getLeft(),o.getRight()))
.collect(Collectors.toList()))::contains)
.collect(Collectors.toList());
}
我被困在如何将“ Pair.getRight()”收集到“ resultList”中,或者作为结果,我想收集“ idAndIndexList”对,但是要保持“ idOrderList”的插入顺序。 任何意见或建议。非常感谢
答案 0 :(得分:0)
最简单的方法是将idAndIndexList
转换为其对应的right
值集并使用Set.contains
。这也避免了不必要地多次运行idAndIndexList.stream()
管道:
Set<String> idSet = idAndIndexList.stream()
.map(Pair::getLeft)
.collect(Collectors.toSet());
List<String> resultList = idOrderList.stream()
.filter(idSet::contains)
.collect(Collectors.toList());
...或者,我想作为结果收集“ idAndIndexList”对,但保持“ idOrderList”的插入顺序
关于这种方法,您可以使用sorted
并根据项目在idOrderList
中的索引对它们进行排序:
List<String> resultList2 = idAndIndexList.stream()
.map(Pair::getLeft)
.sorted(Comparator.comparingInt(idOrderList::indexOf)) //be careful here
.collect(Collectors.toList());
但是要特别注意的是,如果idAndIndexList
包含重复项,则结果可能会超出您的预期。在这种情况下,第一种方法更可靠。