在java中,根据列表的大小追加列表

hec6srdp  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(240)

我试图根据它们的大小附加两个列表。前面有更大的列表。
我很少有这样的清单。 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())

但我无法取得适当的结果。如果有人能指出我的错误,我仍在努力学习。

tyky79it

tyky79it1#

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);

yebdmbv4

yebdmbv42#

也许可以使用 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());

相关问题