Java中按相关列表排序的订单

时间:2019-05-16 10:06:13

标签: java sorting

我有两个列表:

List<Double> nums = Arrays.asList(5.0, 0.9, 10.4);
List<Double> mappedNums = Arrays.asList(2.1, 0.3, 1.2);

我想根据numsmappedNums进行排序:我想将nums设为[0.9, 10.4, 5.0],因为0.9是的第二个元素nums,而mappedNums的第二个元素最小,依此类推。我该怎么办?

3 个答案:

答案 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]