【问题标题】:How to compare all elements of a list with each other? [closed]如何相互比较列表的所有元素? [关闭]
【发布时间】:2021-02-10 14:43:44
【问题描述】:

如何在 Java lambda 流中做到这一点,避免重复?

List<SubItem> tempSplitFilesList = new ArrayList<>();
List<SubItem> splitFilesList = new ArrayList<>();

for (SubItem item1 : tempSplitFilesList) {
    for (SubItem item2 : tempSplitFilesList) {
        if (item1.getStop().equals(item2.getStart())) {
            splitFilesList.add(item2);
        }
    }
}

【问题讨论】:

    标签: java lambda java-stream


    【解决方案1】:

    是的。但我不会说它比你拥有的更好。你所拥有的也包含重复项。

    List<SubItem> splitFilesList = tempSplitFilesList.stream()
            .flatMap(item1 -> tempSplitFilesList.stream()
                    .filter(item2 -> item1.getStop()
                            .equals(item2.getStart()))) // .distinct() if no dups
            .collect(Collectors.toList());
    

    如果您想消除重复项,您可以在过滤器之后调用.distinct() 方法。这将起作用,因为即使在默认情况下,如果比较相同的对象,equals 也会返回 true。

    【讨论】:

      【解决方案2】:

      恕我直言,您可以交换内循环和外循环(或 stream)并使用 filteranyMatch 方法:

      public static void main(String[] args) {
          List<SubItem> list = List.of(
                  new SubItem("123", "111"),
                  new SubItem("234", "222"),
                  new SubItem("345", "333"),
                  new SubItem("456", "444"),
                  new SubItem("567", "123"),
                  new SubItem("678", "234"),
                  new SubItem("789", "345"));
      
          List<SubItem> list2 = list.stream()
                  .filter(item1 -> list.stream()
                          .anyMatch(item2 -> item1.getStart()
                                  .equals(item2.getStop())))
                  .collect(Collectors.toList());
      
          // output
          list2.forEach(System.out::println);
          //SubItem{start='123', stop='111'}
          //SubItem{start='234', stop='222'}
          //SubItem{start='345', stop='333'}
      }
      
      public static class SubItem {
          String start, stop;
      
          public SubItem(String start, String stop) {
              this.start = start;
              this.stop = stop;
          }
      
          public String getStart() { return start; }
          public String getStop() { return stop; }
      
          @Override
          public String toString() {
              return "SubItem{start='" + start + "', stop='" + stop + "'}";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        相关资源
        最近更新 更多