【问题标题】:Remove items from ArrayList with certain value从 ArrayList 中删除具有特定值的项目
【发布时间】:2015-03-17 18:52:30
【问题描述】:

我创建了一个对象列表并添加了人员:

ArrayList<Person> peeps = new ArrayList<Person>(); 

peeps.add(new Person("112", "John", "Smith"));
peeps.add(new Person("516", "Jane", "Smith"));
peeps.add(new Person("114", "John", "Doe"));

我想弄清楚如何通过 ID 号从列表中删除此人。因此,如果我想删除 ID 号为 114 的人,但现在不在列表中,我该怎么办?

【问题讨论】:

  • 你必须使用 ArrayList 吗?使用 HashMap. 会更好
  • 您没有为您的问题选择正确的数据结构。使用Map,而不是List
  • 你能扩展你的 Person 类吗?
  • @lacraig2 Map&lt;String, Person&gt;
  • @m0skit0 是的。将是一个字符串。像这样存储整数有点奇怪,但它是一个字符串。

标签: java arraylist


【解决方案1】:

使用 Java8:

peeps.removeIf(p -> p.getId().equals("112"));

请注意,这相当于线性搜索,将花费O(n) 时间。如果此操作会频繁重复,建议使用HashMap 以加快处理速度至O(1)

使用排序列表也可以解决问题,但需要O(log n) 时间。

【讨论】:

  • 使用 Java 8 lambda 表达式和新功能的好方法。
  • 很好,可以直接使用
  • 太棒了!很好地使用 SE 8!为我省去了大量迭代以删除该对象的麻烦。
【解决方案2】:

如果您要使用 ArrayList,唯一的方法是遍历整个列表,查看每个人,然后看到他们的 id 号是 114。对于较大的数据集,这不会高效且应该避免。

如果您可以更改数据结构,那么某种Map 会更好(HashMap 通常是一个不错的选择)。您可以将 ID 号作为“键”,然后将其与每个人相关联。稍后您可以通过键查询地图。缺点是你只能有一个值作为键,所以你不能同时说出姓名和身份证号码键

编辑:
使用 ArrayList 的一种更有效的方法是按 id 编号对其进行排序。然后您可以使用Collections.binarySearch() 之类的东西通过 id 号快速访问元素。缺点是从排序数组中删除/插入到排序数组中是昂贵的,因为必须移动所有更大的元素。因此,如果与读取次数相比,您要做的更改相对较少,这可能是可行的

【讨论】:

  • 很好的答案,但这不是唯一的方法。关于地图的好建议。
【解决方案3】:

有很多方法可以解决这个问题。

  1. 我正在使用来自 apache.common.collection4 的 CollectionUtils 或其 google 等效项。然后使用谓词或在 java 8 中使用 lambda 表达式选择您想要的。
CollectionUtils.select(peeps, new Predicate<Person>() {
    @Override
    public boolean evaluate(Person object) {
        return object.getId().equals("114");
    }
});
  1. 使用良好的旧迭代器并对其进行循环
Iterator<Person> iterator = peeps.iterator();
while(iterator.hasNext()) {
   Person next = iterator.next();
   if(next.getId().equals("114")) {
       iterator.remove();
   }
}

【讨论】:

    【解决方案4】:

    iterateArrayList 元素中并删除与您要删除的字符串匹配的那些: Iterator remove 操作是安全的,不会创建ConcurrentModificationException

    for (Iterator<String> iterator = peeps.iterator(); elementToCheck = iterator.next();) {
        if (elementToCheck.getId().equals("112")) {
            // Remove the current element from the iterator and the list.
            iterator.remove();
        }
    }
    

    【讨论】:

    • 是的。我改变了它。 Iterator remove 是安全的,不会导致此异常。
    • 你可以把elementToCheck = iterator.next()放在for中;)
    • true :D 改变了它;-)
    【解决方案5】:

    您首先需要在您的 Person 类中有一个有效的equals(您应该这样做)。然后你可以只使用List#indexOfList#remove。例如:

    final Person toRemove = new Person("112");
    peeps.remove(peeps.indexOf(toRemove));
    

    (假设人员 ID 是唯一的)。

    或者,如果您的列表是ArrayList,您可以使用ArrayList#remove(Object)

    final Person toRemove = new Person("112");
    peeps.remove(toRemove);
    

    如果您使用的是 Java 8,则可以使用 Paul's solution

    【讨论】:

      【解决方案6】:

      如果你想搜索字符串,那么应该使用 .equals

      String query;
      ArrayList<String> list;
      
         for(int i=0; i < list.size();i++)
             if (list.get(i).equals(query)){
                 list.remove(i);
                 break;
             }
      

      【讨论】:

      • ArrayList 在问题中非常清楚。
      【解决方案7】:
      class Processor{
      
      ArrayList<Person> peeps = new ArrayList<Person>(); 
      
      void setPeeps(){
          peeps.add(new Person(112, "John", "Smith"));
          peeps.add(new Person(516, "Jane", "Smith"));
          peeps.add(new Person(114, "John", "Doe"));
      }
      
      void removePerson(int id){
          for(int i=0; i <= peeps.size(); i++){
              Person person = peeps.get(i);
              if(person.id == id)
                  peeps.remove(peeps.get(i));
          }
      }
      
      void displayPersonsList(){
          for(Person person : peeps){
              System.out.println(person.id + ":" + person.fName + ":" + person.lName);
          }
      }
      
      public static void main(String args[]){
          Processor objProcessor = new Processor();
          objProcessor.setPeeps();
          objProcessor.removePerson(114);
          objProcessor.displayPersonsList();
      }
      }
      
      class Person{
      int id;
      String fName;
      String lName;
      
      public Person(int id, String fName, String lName){
          this.id = id;
          this.fName = fName;
          this.lName = lName;
      }
      }
      

      【讨论】:

      • 我不只是在这里输入代码。我在 STS 上尝试过,运行它,然后复制它。你可以在这里发布你的错误吗?我又试了一次,成功了!
      • @JobinThomas 尝试删除除最后一个之外的任何条目! (假设您仍在阅读该网站)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多