如何使用Java ArrayList删除对象的一个实例

如何使用Java ArrayList删除对象的一个实例,java,list,arraylist,Java,List,Arraylist,如果我有两个ArrayList和toremove,我想删除列表中与toremove上的对象相等的所有对象。但只有一次对象的一个实例。我如何在Java中实现这一点?我是否必须手动循环所有toremove对象,并在列表中删除它 我已经试过了;但它会删除所有对象的实例 例如,如果我有book1 book1 book2 book3,我的toRemove列表是book1 book2。输出将是book1 book3 private List RemoveList初始值,List toremove{ 列表=首

如果我有两个ArrayList和toremove,我想删除列表中与toremove上的对象相等的所有对象。但只有一次对象的一个实例。我如何在Java中实现这一点?我是否必须手动循环所有toremove对象,并在列表中删除它

我已经试过了;但它会删除所有对象的实例

例如,如果我有book1 book1 book2 book3,我的toRemove列表是book1 book2。输出将是book1 book3

private List RemoveList初始值,List toremove{ 列表=首字母; 图书目录{ } 退货清单; } 只要用这个:

for (Book b : toremove) {
  int index = list.indexOf(b);
  if (index != -1) list.remove(index);
}
这将查找对象的索引,然后使用该索引将其删除,只要该书存在于列表中

当然,正如sc0der所说,您必须重写Book类的equals方法,但我怀疑您已经这样做了,因为removeAll确实可以删除所有对象

输入示例:

list = new ArrayList<>();
list.add(book1);
list.add(book1);
list.add(book2);
list.add(book1);
list.add(book3);
toremove = Arrays.asList(new Book[]{book1, book2});
只要用这个:

for (Book b : toremove) {
  int index = list.indexOf(b);
  if (index != -1) list.remove(index);
}
这将查找对象的索引,然后使用该索引将其删除,只要该书存在于列表中

当然,正如sc0der所说,您必须重写Book类的equals方法,但我怀疑您已经这样做了,因为removeAll确实可以删除所有对象

输入示例:

list = new ArrayList<>();
list.add(book1);
list.add(book1);
list.add(book2);
list.add(book1);
list.add(book3);
toremove = Arrays.asList(new Book[]{book1, book2});
重写book类中的equals

static class Book {
        int id;
        String title;

        public Book(int id, String title) {
            this.id = id;
            this.title = title;
        }

        @Override
        public boolean equals(Object obj) {
            Book other = (Book) obj;
            return this.title.equals(other.title);
        }

        @Override
        public String toString() {
            return id + ": " + title;
        }
    }

并使用remove删除列表中第一个出现的对象

重写book类中的equals

static class Book {
        int id;
        String title;

        public Book(int id, String title) {
            this.id = id;
            this.title = title;
        }

        @Override
        public boolean equals(Object obj) {
            Book other = (Book) obj;
            return this.title.equals(other.title);
        }

        @Override
        public String toString() {
            return id + ": " + title;
        }
    }

并使用remove删除列表中第一个出现的对象


您可以按如下方式进行操作:

private static List<Book> removeList(List<Book> initial, List<Book> toRemove) {
    List<Book> toBeReturned = new ArrayList<Book>(initial);
    List<Book> deleted = new ArrayList<Book>();
    Iterator<Book> itr = toBeReturned.iterator();
    while (itr.hasNext()) {
        Book a = itr.next();
        for (Book b : toRemove) {
            if (b.equals(a) && !deleted.contains(b)) {
                deleted.add(b);
                itr.remove();
            }
        }
    }
    return toBeReturned;
}

您可以按如下方式进行操作:

private static List<Book> removeList(List<Book> initial, List<Book> toRemove) {
    List<Book> toBeReturned = new ArrayList<Book>(initial);
    List<Book> deleted = new ArrayList<Book>();
    Iterator<Book> itr = toBeReturned.iterator();
    while (itr.hasNext()) {
        Book a = itr.next();
        for (Book b : toRemove) {
            if (b.equals(a) && !deleted.contains(b)) {
                deleted.add(b);
                itr.remove();
            }
        }
    }
    return toBeReturned;
}

顺便说一句,请不要大写你的变量。List List=初始值会导致一些非常混乱的代码。顺便说一句,请不要将变量大写。List List=Initial会导致一些非常混乱的代码,但这会删除一本书的所有实例,对吗?我希望它只删除oneNo,它将删除id为1的书籍,但如果我有多本id为1的书籍?因此您只想删除一本id为1的书籍?如果“列表”中存在,它将从删除列表中删除所有对象,但这将删除一本书的所有实例,对吗?我只想删除一本,它会删除id为1的书,但是如果我有多本id为1的书?那么你只想删除一本id为1的书?如果“列表”中存在,它会删除列表中的所有对象。哦,我会试试看哦,我会试试看
Book [id=1]
Book [id=1]
Book [id=2]
Book [id=3]