Я уже задавал этот вопрос в этом посте: Как удалить объекты not equals с помощью ArrayList в Java
Но в некоторых случаях предлагаемое решение не работает. Я пробовал 2 из них. То, что я хочу сделать, довольно просто сказать, но когда я начинаю express это в коде ... он становится беспорядочным.
У меня есть ArrayList книг, и я хочу удалить определенное число книг, только если они разные (с использованием одинаковых).
Например, если у меня есть 3 разных книги, а количество моих удаляемых книг равно 3 .., то эти 3 книги должны быть удалены. Предполагая, что количество удаленных книг не может быть больше, чем количество РАЗНЫХ книг внутри массива. В случаях, когда в ArrayList более одной книги ... например, book1 book1 book1 book2 book3
, а quantitytoremove
равно 2, тогда book1 and book2
(например) следует удалить. Результатом будет book1 book1 book3
. Следует удалить только один экземпляр другой книги
обратите внимание, что equals
было переопределено правильно.
Это мое первое решение (для меня более логично)
public Basket removeDifferent2(int quantitytoremove) {
System.out.println("looking at the basket before removal... of " + quantitytoremove + " different books");
printBasket();
// creating a copy of the books array
List<Book> myBooks = new ArrayList(Arrays.asList(this.Books));
// list of books to remove
List<Book> tobeRemovedList = new ArrayList<Book>();
// removing books from the basket according to quantitytoremove.
for (int i = 0; i < myBooks.size() && tobeRemovedList.size() < quantitytoremove; i++) {
for (int j = i + 1; j < myBooks.size() && tobeRemovedList.size() < quantitytoremove; j++) {
if (!(myBooks.get(i).equals(myBooks.get(j)))
&& !tobeRemovedList.contains(myBooks.get(j))) {
System.out.println("Removing Book " + myBooks.get(j).getbooknumber() + " from the basket");
tobeRemovedList.add(myBooks.get(j));
}
}
}
myBooks = removeList(myBooks, tobeRemovedList);
// case where there is one book left to remove that was not considered in the
// previous loops
if (tobeRemovedList.size() < quantitytoremove && myBooks.size() == 1) {
System.out.println("Removing Book " + myBooks.get(0).getbooknumber() + " from the basket");
myBooks.remove(myBooks.get(0));
}
// creating the new basket without the removed books
Book[] newbooks = new Book[myBooks.size()];
newbooks = myBooks.toArray(newbooks);
Basket newbasket = new Basket(newbooks);
return newbasket;
}
private List<Book> removeList(List<Book> list,List<Book> toRemove) {
for (Book b : toRemove) {
list.remove(b);
}
return list;
}
Это еще один, который я пробовал
public Basket removeDifferent(int quantityToRemove) {
System.out.println("looking at the basket before removal... of " + quantityToRemove + " different books");
printBasket();
// creating a copy of the books array
List<Book> myBooks = new ArrayList(Arrays.asList(this.Books));
int qn = removeDifferent(myBooks, quantityToRemove, 0, 0, 1);
if (myBooks.size() == 1 && qn < quantityToRemove)
myBooks.remove(0);
// creating the new basket
Book[] newbooks = new Book[myBooks.size()];
newbooks = myBooks.toArray(newbooks);
Basket newbasket = new Basket(newbooks);
return newbasket;
}
private int removeDifferent(List<Book> booksArray, int quantityToRemove, int qn, int i, int j) {
if (i >= booksArray.size() || j >= booksArray.size() || qn >= quantityToRemove)
return qn;
if (!booksArray.get(i).equals(booksArray.get(j))) {
System.out.println("Removing Book " + booksArray.get(j).getbooknumber() + " from the basket");
booksArray.remove(j);
j--;
qn++;
}
qn = removeDifferent(booksArray, quantityToRemove, qn, i, 1 + j);
++i;
qn = removeDifferent(booksArray, quantityToRemove, qn, i, i + 1);
return qn;
}
теперь в этом случае он не работает, и это сложно для меня чтобы понять почему. Как видите, отсутствует одно удаление, и после удаления трех разных книг корзина должна выглядеть примерно так:
Номер книги 1
Book mybook1 = new Book(1);
Book mybook2 = new Book(2);
Book mybook3 = new Book(3);
Book mybook4 = new Book(4);
Book mybook5 = new Book(5);
Book[] books = { mybook1,mybook1,mybook4, mybook5 };
Basket basket = new Basket(books);
Basket newbasket= basket.removeDifferent(3);
System.out.println("printing current basket..");
newbasket.printBasket();
