【问题标题】:Append list according to their size in Java在Java中根据它们的大小附加列表
【发布时间】:2021-09-15 11:06:13
【问题描述】:

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

我很少有这样的清单。

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

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

【问题讨论】:

  • 在这里使用流似乎完全没有必要,你有什么理由吗?
  • 主要是从学习的角度。此外,使用Stream,可以将用例扩展到更多数量的List

标签: java list arraylist append java-stream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    for-loop 很不错,Stream 不是必须的,但是要回答这个问题,你可以

    • 不要使用concat,因为它已经加入了列表,并且你失去了不同列表的概念
    • 不要使用filter,而是使用sorted
    • 然后flatMapStream&lt;List&lt;Pair&lt;&gt;&gt;&gt; 传递到Stream&lt;Pair&lt;&gt;&gt;
    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);
    

    【讨论】:

    • @JoakimDanielson 这只是 OP 在末尾添加的列表
    • 还有如何使用.sorted(Comparator.comparing(List::size, Comparator.reverseOrder())) 以相反的顺序对它们进行排序,然后将它们展平——同样的事情不同的方式
    • @PiyushAggarwal 不记得那个结构,虽然关于.sorted(Comparator.comparing(List::size).reversed())non static method cannot be referenced 有错误,我不想强​​制使用特定类型的 lmabda wuth
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2019-02-28
    • 1970-01-01
    • 2022-10-21
    • 2011-03-07
    • 2016-11-19
    • 2015-02-08
    相关资源
    最近更新 更多