Как удалить один экземпляр объекта с помощью Java ArrayList - PullRequest
1 голос
/ 07 мая 2020

Если у меня есть два списка ArrayList list и toremove, и я хочу удалить все объекты на list, которые равны объектам на toremove. Но только один раз (один экземпляр объекта). Как я могу добиться этого в Java? Нужно ли мне вручную l oop просмотреть все объекты toremove и удалить его, если он находится в list?

Я пробовал .removeAll(toremove);, но он удаляет все экземпляры, если объекты.

например, если у меня есть book1 book1 book2 book3, а мой список toRemove - book1 book2. вывод будет book1 book3.


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

        for (Book book : List) {

        }

        return List;
    }

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Просто используйте это:

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

Это найдет индекс вашего объекта, а затем удалит его, используя этот индекс, пока эта книга присутствует в list.

Of Конечно, как сказал sc0der, вам придется переопределить метод equals для класса Book, но я подозреваю, что вы уже это сделали, поскольку 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});

Пример вывода:

list = [book1, book1, book3]
1 голос
/ 07 мая 2020

Это можно сделать следующим образом:

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

Вывод:

Book [id=1]
Book [id=1]
Book [id=2]
Book [id=3]
1 голос
/ 07 мая 2020

Переопределить 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()


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

, вывод

[1: book1, 4: book3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...