【问题标题】:Remove only one element from duplicated list从重复列表中仅删除一个元素
【发布时间】:2018-06-13 20:04:23
【问题描述】:

我有一个包含相同元素的简单列表:

private List<String> boxes = new ArrayList<>();
    boxes.add("100");
    boxes.add("20");
    boxes.add("20");
    boxes.add("5");
    boxes.add("5");
    boxes.add("5");
    boxes.add("5");
    boxes.add("5");
    boxes.add("Extra life");
    boxes.add("Game over");
    boxes.add("Game over");
    boxes.add("Game over");

我想从此列表中删除“游戏结束”值,但只删除一个,而不是全部三个。我该怎么做?我尝试在此列表中调用 remove 方法,但它删除了所有三个元素。

【问题讨论】:

  • remove 删除列表中传递的参数的第一次出现
  • 无法重现 “我尝试在此列表中调用 remove 方法,但它删除了所有三个元素”。请参阅 IDEONE 以证明 remove 有效。正如 nits.kk 所提到的,remove(str) 的 javadoc 说:从该列表中删除指定元素的第一次出现(如果存在)。

标签: java list collections


【解决方案1】:

您可以使用remove 方法的这种重载:

boxes.remove("Game over");

【讨论】:

  • 这是一个更好的方法。它更简单,不同的实现将使用适当的策略。具体来说 ArrayList 和 LinkedList 将分别使用索引和迭代器。全部来自 JDK,经过良好测试。
【解决方案2】:
public static void remove(List<String> boxes, String str) {
    int index = boxes.indexOf(str);

    if(index >= 0)
        boxes.remove(index);
}

关于它的一件事。我担心List&lt;String&gt; 的具体实现。在某些情况下,boxes.remove(index) 可能会占用O(n)。所以认为使用Iterator 实现可能会更好(但不是关键)。它只循环给定列表一次。

public static void remove(List<String> boxes, String str) {
    Iterator<String> it = boxes.iterator();

    while (it.hasNext()) {
        if (it.next().equals(str)) {
            it.remove();
            break;
        }
    }
}

此外,正如 @Andreas 所述,List.remove(Object) 仅删除第一个找到的元素。您尝试的方法似乎工作正常:

public static void remove(List<String> boxes, String str) {
    boxes.remove(str);
}

【讨论】:

  • 为什么不只使用remove(str)从该列表中删除第一次出现的指定元素(如果存在)。
  • @Andreas 是的,我已经检查过了。它也确实有效。
猜你喜欢
  • 2015-01-05
  • 2012-05-09
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2019-08-02
相关资源
最近更新 更多