【问题标题】:Remove items from list by comparing items from other List通过比较其他列表中的项目从列表中删除项目
【发布时间】:2021-03-12 22:31:24
【问题描述】:

您好,我正在尝试通过检查其他列表来从列表中删除项目。它看起来像这样,

List<Model> list1 = Arrays.asList(new Model("pink",4),new Model("red",3))
List<Model> list2 = Arrays.asList(new Model("pink",4),new Model("pink",3),new Model("violet",9))

我想从 list2 中删除两个粉红色项目,因为 list1 中包含相同的内容,因此我不能使用 equals,因为我只使用颜色进行比较。

如何以一种好的方式做到这一点,也许使用流?

最终结果应该是这样的:

[Model("violet",9)]

【问题讨论】:

  • 将所需的结果添加到您的问题中。
  • 您有什么方法可以访问模型的颜色吗?即,你能做到Model.colorModel.getColor()吗?
  • 完成,编辑帖子以显示所需的结果。
  • @M-Chen-3 当然,所有属性都有getter setter
  • Model构造函数的第二个参数(数量?)在你的逻辑中是否起任何作用?

标签: java java-stream


【解决方案1】:

简单地说,你的问题的答案是:不可能 - 你不能从通过调用Arrays.asList 获得的列表中删除任何东西(你可以.set,但你不能添加,删除,或以任何其他方式更改大小;它只是数组周围的轻包装器,数组在 java 中是固定大小的)。所以让我们假设你有 2 个 ArrayList 实例,可能是用new ArrayList&lt;&gt;(Arrays.asList(...)) 创建的,那么你可以删除一些东西。

您选择的数据结构效率低下。如果受限于“我有 2 个列表”,“最好”的方式就是……一次迈出一步:

Set<String> forbiddenColors = list1.stream()
  .map(Model::getColor)
  .collect(Collectors.toSet());
list2.removeIf(x -> forbiddenColors.contains(x.getColor()));

通过使用列表,这个速度应该是~O(n),而 O(n^2)。除非您在这些列表中有成千上万的东西,否则这无关紧要,但以防万一 - 这不会很糟糕。

【讨论】:

    【解决方案2】:

    如果list2 是可变的,您可以简单地使用removeIf

    list2.removeIf(model->list1.stream().anyMatch(m->m.getColor().equals(model.getColor())));
    

    如果list2 是不可变的,那么您可以使用filter 并将输出收集到另一个列表中

    List<Model> result = list2.stream()
                              .filter(model->list1.stream()
                                                  .noneMatch(m->m.getColor().equals(m.getColor())))
                              .collect(Collectors.toList());
                                    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2022-12-20
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多