【发布时间】:2020-08-23 06:09:11
【问题描述】:
我已经在这篇文章中问过这个问题:How to remove not equals Objects using ArrayList in Java
但在某些情况下,建议的解决方案不起作用。我已经尝试了其中的 2 个。 我想做的事情说起来很简单,但是当我开始用代码表达它时..它会变得混乱。
我有一个 ArrayList 书籍,我想删除一定数量的书籍 仅当它们不同时(使用等于)。
例如,如果我有 3 本不同的书,我要删除的数量是 3..那么这三本书必须被删除。假设要删除的数量不能高于 DIFFERENT 书的数量 大批。如果同一本书中有超过 1 本 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;
}
现在在这种情况下它失败了,我很难理解为什么。如您所见,缺少一本移除书,移除 3 本书后,篮子应该是这样的:
书号 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();
【问题讨论】:
-
您能否也添加
Book和Basket代码以使您的示例可运行? -
@MaksimIakunin 对于一个帖子来说这太过分了,但这些都是非常基础的课程,一本书只有一个数字,而 Basket 有一个数组。就是这样