Java 从ArrayList中删除具有特定值的项

Java 从ArrayList中删除具有特定值的项,java,arraylist,Java,Arraylist,我已经创建了一个对象列表,并向其中添加了人员: 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")); ArrayList peeps=new A

我已经创建了一个对象列表,并向其中添加了人员:

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"));
ArrayList peeps=new ArrayList();
添加(新人物(“112”、“约翰”、“史密斯”);
添加(新人物(“516”、“简”、“史密斯”);
添加(新的人(“114”、“约翰”、“Doe”);

我正试图找出如何从名单中删除的人的ID号码。所以如果我想除掉身份证号码为114的人,但现在不知道它在列表中的位置,如何?

ArrayList
元素中迭代
,并删除与要删除的字符串匹配的元素:
迭代器删除
操作是安全的,不会创建
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();
    }
}
for(迭代器迭代器=peeps.Iterator();elementToCheck=Iterator.next();){
if(elementToCheck.getId()等于(“112”)){
//从迭代器和列表中删除当前元素。
iterator.remove();
}
}
使用Java8:

peeps.removeIf(p -> p.getId().equals("112"));
请注意,这相当于线性搜索,需要
O(n)
时间。如果频繁重复此操作,建议使用
哈希映射
,以将速度提高到
O(1)


或者,使用排序列表也可以做到这一点,但需要
O(logn)
时间。

您首先需要在Person类中有一个工作
等于
(您应该这样做)。然后您可以使用
List#indexOf
List#remove
。例如:

final Person toRemove = new Person("112");
peeps.remove(peeps.indexOf(toRemove));
(假设人员ID是唯一的)

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


如果您使用的是Java 8,则可以使用。

如果您要使用ArrayList,唯一的方法是浏览整个列表,查看每个人,并查看其id号为114。对于较大的数据集,这将不会有效率,应该避免

如果您可以更改您的数据结构,那么采用某种方式会更好(通常是一个不错的选择)。您可以将id号作为“密钥”,然后将其与每个人关联。以后可以按键查询地图。缺点是你只能有一个值作为一个键,所以你不能同时拥有name和id-number键

编辑:

使用ArrayList的一种更有效的方法是按id号对其进行排序。然后您可以使用类似的方法通过id号快速访问元素。缺点是从排序数组中删除/插入的代价很高,因为元素中较大的所有内容都必须移动。因此,如果与读取次数相比,您要做的更改相对较少,那么这可能是可行的

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

  • 我使用的是apache.common.collection4中的CollectionUtils或其谷歌等效版本。然后使用谓词或java 8中的lambda表达式选择所需内容
  • CollectionUtils.select(peeps,new Predicate(){
    @凌驾
    公共布尔求值(Person对象){
    返回object.getId().equals(“114”);
    }
    });
    
  • 使用好的旧迭代器并在其上循环
  • Iterator Iterator=peeps.Iterator();
    while(iterator.hasNext()){
    Person next=迭代器.next();
    if(next.getId().equals(“114”)){
    iterator.remove();
    }
    }
    
    类处理器{
    ArrayList peeps=新的ArrayList();
    void setPeeps(){
    peeps.add(新人(112,“约翰”、“史密斯”);
    peeps.add(新人(516,“简”,“史密斯”);
    peeps.add(新的人(114,“约翰”,“多伊”));
    }
    无效删除人(内部id){
    
    对于(int i=0;i如果要搜索字符串,则应使用.equals

    String query;
    ArrayList<String> list;
    
       for(int i=0; i < list.size();i++)
           if (list.get(i).equals(query)){
               list.remove(i);
               break;
           }
    
    字符串查询;
    数组列表;
    对于(int i=0;i
    你必须使用ArrayList吗?你最好使用HashMap。你没有为你的问题选择正确的数据结构。使用
    Map
    ,而不是
    列表
    。你能扩展你的Person类吗?@lacraig2
    Map
    @m0skit0 true。这是一个字符串。这样存储整数有点奇怪,但它是一个string、 使用Java 8 lambda表达式和新功能的很好。很好,它是直接使用的。很好地使用了SE 8!为我省去了大量的麻烦,需要通过迭代来删除该对象。真的。我更改了它。迭代器删除是安全的,不会导致此异常。您只需将
    elementToCheck=Iterator.next()
    中的
    for
    ;)正确:D更改了它;-)回答不错,但这不是唯一的方法。关于地图的建议很好。我不仅在这里键入了代码。我在STS上尝试了它,运行了它,然后复制了它。你能在这里发布你的错误吗?我再试了一次,效果很好!@JobinThomas尝试删除除最后一个之外的任何条目!(假设您仍在阅读网站)
    CollectionUtils.select(peeps, new Predicate<Person>() {
        @Override
        public boolean evaluate(Person object) {
            return object.getId().equals("114");
        }
    });
    
    Iterator<Person> iterator = peeps.iterator();
    while(iterator.hasNext()) {
       Person next = iterator.next();
       if(next.getId().equals("114")) {
           iterator.remove();
       }
    }
    
    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;
    }
    }
    
    String query;
    ArrayList<String> list;
    
       for(int i=0; i < list.size();i++)
           if (list.get(i).equals(query)){
               list.remove(i);
               break;
           }