我想根据列表 2 中存在的值交换列表 1 中元素的位置[已关闭]

问题描述 投票:0回答:1

列表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 中互换

java spring list sorting arraylist
1个回答
0
投票

这是您可以采取的一种方法。

首先,让我们构建一个辅助数据结构,这将有助于减少运行时间。这将充当一个查找表,它会告诉我们第二个列表中是否存在某个元素以及它所在的索引(时间复杂度为 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);
© www.soinside.com 2019 - 2024. All rights reserved.