我有两个列表:
List<Double> nums = Arrays.asList(5.0, 0.9, 10.4);
List<Double> mappedNums = Arrays.asList(2.1, 0.3, 1.2);
我想根据nums
对mappedNums
进行排序:我想将nums
设为[0.9, 10.4, 5.0]
,因为0.9
是的第二个元素nums
,而mappedNums
的第二个元素最小,依此类推。我该怎么办?
答案 0 :(得分:4)
尽管其他人已经成功地展示了使用流等执行此操作的方法。我将大胆地建议问题中的前提条件有缺陷,并且使解决方案(应难以阅读和维护)比应有的困难。
两个列表中的值相关。它们应该存储在相同的数据结构中,而不是存储在两个单独的列表中。
将值组合到一个列表中,该列表包含专用类中的键值对。但是不要将它们命名为“键”,“值”或“ KeyValuePair”(标准Java之所以没有KeyValue类的原因是,人们会立即滥用它,而无需考虑代码的可读性)。使用描述值含义的名称。将配对对象放在列表中之后,使用专用于该任务的比较器按任一字段对列表进行排序将很简单。
答案 1 :(得分:3)
IntStream.range(0, nums.size())
.mapToObj(x -> new SimpleEntry<>(x, nums.get(x)))
.sorted(Comparator.comparingDouble(x -> mappedNums.get(x.getKey())))
.map(Entry::getValue)
.forEachOrdered(System.out::println);// 0.9 10.4 5.0
答案 2 :(得分:3)
我已经找到了这种方式:首先对被映射的数字进行排序,然后找到它们的索引(已排序),然后使用该索引从其他列表中获取结果
List<Double> result= mappedNums.stream()
.sorted()
.mapToInt(mappedNums::indexOf)
.boxed()
.map(nums::get)
.collect(Collectors.toList());
输出:
[0.9、10.4、5.0]