列表1:
[CBZCYRUQ, CBDYBZQ, CBZDAEQM, CBZDAEUP, CBZDAEUO, CBZDAEUN, CBDYBZR, CBDYBZS, CBZDAEUL, CBZDAEUK]
列表2:
[CBDYBZS, CBDYBZR, CBZDAEUL]
预期输出是:
[CBZCYRUQ, CBDYBZQ, CBZDAEQM, CBZDAEUP, CBZDAEUO, CBZDAEUN, CBDYBZS, CBDYBZR, CBZDAEUL, CBZDAEUK]
在预期输出中,CBDYBZS 和 CBDYBZR 的位置已根据其在列表 2 中的位置进行更改。只有列表 2 中的元素应在列表 1 中互换
这是您可以采取的一种方法。
首先,让我们构建一个辅助数据结构,这将有助于减少运行时间。这将充当一个查找表,它会告诉我们第二个列表中是否存在某个元素以及它所在的索引(时间复杂度为 O(1))。
Map<String, Integer> list2ElementsToIndexMap = IntStream.range(0, list2.size())
.boxed()
.collect(Collectors.toMap(list2::get, Function.identity()));
接下来,我们将流式处理第一个列表并过滤第二个列表中存在的元素,并根据它们在第二个列表中的位置对它们进行排序。比较器
Comparator.comparingInt(list2ElementsToIndexMap::get)
可以做到这一点。
List<String> list1ElementsSortedAccordingToList2 = list1.stream()
.filter(list2ElementsToIndexMap::containsKey)
.sorted(Comparator.comparingInt(list2ElementsToIndexMap::get))
.toList();
最后,我们再次流式传输 list1 并检查该元素是否存在于第二个列表中(使用
list2ElementsToIndexMap
)。
Iterator<String> itr = list1ElementsSortedAccordingToList2.iterator();
List<String> sortedResult = list1.stream()
.map(s -> list2ElementsToIndexMap.containsKey(s) ? itr.next() : s)
.toList();
System.out.println(sortedResult);