【问题标题】:How to only remove one item from list with duplicates?如何仅从具有重复项的列表中删除一项?
【发布时间】:2019-01-05 23:57:54
【问题描述】:

我有一个清单:(x, y, y,z)

我还有另一个列表:(x, y)

您想从第一个列表中删除同时属于第二个列表的项目。

例如:我希望结果是(y,z)

我该怎么做?

编辑:如果我使用 removeAll。示例列表返回 (z)

【问题讨论】:

  • 您想从第一个列表中删除也属于第二个列表的项目。编辑您的问题。
  • 顺序重要吗?例如,如果第二个列表是 (y, x),您是否想要相同的结果?
  • 结果将是 (z) 而不是 (y,z)
  • 伙计们,很简单。我不希望它删除 y 两次。
  • 结果是z

标签: java android list arraylist


【解决方案1】:

这个解决方案似乎可以接受。

List<String> one = new ArrayList<>();
one.add("x");
one.add("y");
one.add("y");
one.add("z");
List<String> two = new ArrayList<>();
two.add("x");
two.add("y");

for (String s : two)
{
    one.remove(s);
}

System.out.println("one : " + one);

输出:

一个:[y, z]


List.remove(Object o) 文档:

从该列表中删除第一个出现的指定元素(如果存在)(可选操作)。如果此列表不包含该元素,则它不变。更正式地说,删除具有最低索引 i 的元素,使得 (o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)。如果此列表包含指定的元素(或等效地,如果此列表因调用而更改),则返回 true。


注意:算法复杂度为O(n*m),避免使用2个非常大的列表(其中nm是列表大小)。

【讨论】:

  • 我尝试了答案,但没有奏效。我会尝试评论。
  • 您也可以使用 lambda two.forEach(one::remove);,但我认为可读性较差,尤其是对于初学者。
【解决方案2】:

您可以通过多种方式做到这一点。下面是一些例子。

List<String> one = new ArrayList<String>();
    one.add("x");
    one.add("y");
    one.add("y");
    one.add("z");
List<String> two = new ArrayList<String>();
    two.add("x");
    two.add("y");

1.使用 Lambda

two.forEach((i)->one.remove(i));
System.out.println(one);

输出:[y, z]

2。 Apache Commons

Collection<Integer> result = CollectionUtils.subtract(one, two);
System.out.println(one);

输出:[y, z]

【讨论】:

  • 如果我全部删除。示例列表返回 (z)
  • 您可以再试一次。我添加了另一个解决方案。
【解决方案3】:

检查一下:

    ArrayList<String> list1 = new ArrayList<String>();
    list1.add("Maria");
    list1.add("Nick");
    list1.add("Nick");
    list1.add("Joe");

    ArrayList<String> list2 = new ArrayList<String>();
    list2.add("Maria");
    list2.add("Nick");

    for (String x : list2) {
        int index = list1.indexOf(x);
        if (index >= 0) {
            list1.remove(index);
        }
    }

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多