根据 Java 中的大小追加列表

Append list according to their size in Java

我正在尝试根据它们的大小附加两个列表。前面有更大尺寸的列表。

我很少有这样的列表。

List<Pair<Double, String>> masterList = new ArrayList<>();

这是我首先尝试的工作 Java 代码 - 使用一个简单的 if else 循环:

       if (listOne.size() >= listTwo.size()){
           masterList.addAll(listOne);
           masterList.addAll(listTwo);
       } else {
           masterList.addAll(listTwo);
           masterList.addAll(listOne);
       }
       masterList.addAll(otherList); // and at the end all other list can be added without any condition

我对 Java 还很陌生,所以我正在研究它并遇到了 Comparators 和 Lambda。因此,我尝试将其用于我的代码,如下所示:

List<Pair<Double, String>> masterList = Stream.concat(listOne.stream(), listTwo.stream())
                .filter(Comparator.comparingInt(List::size))
                .collect(Collectors.toList())

但是我无法获得正确的结果。 谁能指出我的错误,我还在努力学习

for 循环很好,Stream 不是必需的,但要回答这个问题,你可以

  • 不要使用 concat,因为它已经加入了列表,并且您失去了不同列表的概念
  • 不要使用 filter 而是 sorted
  • 然后 flatMapStream<List<Pair<>>> 传递到 Stream<Pair<>>
List<Pair<Double, String>> masterList = Stream.of(listOne, listTwo)
        .sorted(Comparator.comparing(List::size, Comparator.reverseOrder()))
        .flatMap(List::stream)
        .collect(Collectors.toList());
masterList.addAll(otherList);

可能可以使用 Stream.concat 加入 otherList 的内容,从而摆脱 masterList.addAll

还有一个使用Comparator.reversed()方法的例子:

List<Pair<Double, String>> masterList = Stream.concat(
        Stream.of(listOne, listTwo) // Stream<List<Pair>>
          .sorted(Comparator.<List>comparingInt(List::size).reversed())
          .flatMap(List::stream), // Stream<Pair>
        otherList.stream() // Stream<Pair>
    )
    .collect(Collectors.toList());

但是,三元运算符也应该可以很好地检测要放在开头的较长列表:

List<Pair<Double, String>> masterList2 = Stream.concat(
        (listOne.size() >= listTwo.size() 
            ? Stream.of(listOne, listTwo) 
            : Stream.of(listTwo, listOne)
        ) 
        .flatMap(List::stream),
        otherList.stream()
    )
    .collect(Collectors.toList());