通过比较其他列表中的项目从列表中删除项目

rmbxnbpk  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(394)

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

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)]
7ajki6be

7ajki6be1#

简单地说,您的问题的答案是:不可能-您不能从通过调用 Arrays.asList (你可以 .set ,但不能添加、删除或以任何其他方式更改大小;它只是一个围绕数组的轻量级 Package 器,数组的大小在java中是固定的)。假设有2个arraylist示例,可能是用 new ArrayList<>(Arrays.asList(...)) ,然后你可以移除东西。
您选择的数据结构效率低下。“最好的”方法,如果受“我有两个列表”的限制,就是。。。一步一个脚印:

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

通过使用list,速度应该是~o(n),而不是o(n^2)。除非你在这些列表中有成千上万的东西,否则这并不重要,但以防万一,这不会表现得很差。

93ze6v8z

93ze6v8z2#

如果 list2 是可变的,您可以简单地使用 removeIf ```
list2.removeIf(model->list1.stream().anyMatch(m->m.getColor().equals(model.getColor())));

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

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

相关问题