簡體   English   中英

如何使用 Java ArrayList 刪除 object 的一個實例

[英]How to remove one instance of an object using Java ArrayList

如果我有兩個 ArrayList listtoremove ,我想刪除list上與toremove上的對象相等的所有對象。 但只有一次(對象的一個實例)。 如何在 Java 中實現這一點? 如果它在list中,我是否必須手動循環所有toremove刪除的對象並將其刪除?

我試過.removeAll(toremove); 但如果對象,它會刪除每個實例。

例如,如果我有book1 book1 book2 book3 ,而我的toRemove列表是 book1 book1 book2 output 將是book1 book3


    private List<Book>  removeList(List<Book> initial,List<Book> toremove) {
        List<Book> list=initial;

        for (Book book : List) {

        }

        return List;
    }

只需使用這個:

for (Book b : toremove) {
  int index = list.indexOf(b);
  if (index != -1) list.remove(index);
}

這會找到 object 的索引,然后只要該書存在於list中,就使用該索引將其刪除。

當然,正如 sc0der 所說,您必須重寫Book class 的 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});

示例 output:

list = [book1, book1, book3]

覆蓋書籍 class 中的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()列表中第一次出現的 object


    public static void main(String[] a) {
        Book b1 = new Book(1, "book1");
        Book b2 = new Book(1, "book1");
        Book b3 = new Book(3, "book2");
        Book b4 = new Book(4, "book3");
        List<Book> list = new ArrayList<>();
        list.add(b1);
        list.add(b2);
        list.add(b3);
        list.add(b4);
        removeFirstOccurance(list, Arrays.asList(b1, b3));
        System.out.println(list);
    }

    private static void removeFirstOccurance(List<Book> list, List<Book> toRemove) {
        for (Book b : toRemove) {
            list.remove(b);
        }
    }

, output

[1: book1, 4: book3]

你可以這樣做:

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;
}

演示:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

class Book {
    int id;

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

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

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

    @Override
    public String toString() {
        return "Book [id=" + id + "]";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Book> initial = new ArrayList<Book>();
        initial.add(new Book(1));
        initial.add(new Book(1));
        initial.add(new Book(1));
        initial.add(new Book(2));
        initial.add(new Book(2));
        initial.add(new Book(3));

        List<Book> toRemove = new ArrayList<Book>();

        toRemove.add(new Book(1));
        toRemove.add(new Book(2));

        List<Book> list = removeList(initial, toRemove);

        // Display list
        list.stream().forEach(System.out::println);
    }

    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;
    }
}

Output:

Book [id=1]
Book [id=1]
Book [id=2]
Book [id=3]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM