我正在修补一个库的代码并且遇到了很多麻烦所以我需要首先解决的是如何添加和删除书籍,同时还使用tostring来打印数组的当前和以前的内容。它打印出来的很好,但它并没有将它们移除。谁能告诉我为什么?当它打印出来时,我希望它只能说一次标题
标题:Gunlsinger
绘制三个
不: 标题:枪手
标题:绘制三个
class Library {
private String books;
Library(String b) {
// this.owner=o;
this.books = b;
}
//
public String toString() {
return "\nTitle:" + this.books;
// System.out.println
}
public static void main(String[] args) {
ArrayList<Library> books = new ArrayList<Library>();
books.add(new Library("The Gunslinger"));
books.add(new Library("The Drawing of the Three"));
books.remove("The Gunslinger");
for (Library a : books) {
System.out.println(a);
}
}
}
答案 0 :(得分:0)
首先,您必须为equals()
课程实施hashCode()
和Library
方法。然后,您可以使用books.remove(new Library("The Gunslinger"))
。
答案 1 :(得分:0)
首先需要学习的东西很少。
equals()
课程中的hashcode()
和Library
方法,因此equals()
可以轻松地将您的课程用于ArrayList
操作。可以在http://tutorials.jenkov.com/java-collections/hashcode-equals.html String
的arraylist中删除Library
。这是行不通的,因为很明显,字符串不存在于该arraylist中,而是Library
类的对象。要从该arraylist中删除对象,您需要编写类似 books.remove(new Library("The Gunslinger"));
但要实现这一目标,您需要实施上述第1点。
更多信息:Relationship between hashCode and equals method in Java
答案 2 :(得分:0)
从满足某些条件的集合中删除对象的简单方法是removeIf
方法。
使用Java 8,这看起来像:
class Book {
public String getTitle() {
...
}
}
List<Book> library;
library.removeIf(book -> book.getTitle().equals("The Gunslinger"));
这不要求您覆盖用于集合项的类中的equals
和hashCode
,因为谓词明确声明了您要查找的条件。
如果条件确实代表两本书是同一本书,我只会建议覆盖equals
。具有相同的标题可能不是唯一的条件:对于具有相同标题的两本书,可以有多个版本甚至不同的作者。
如果您remove
方法的意图确实删除了所有具有给定标题的图书,那么我建议您更改其名称(至removeAllBooksWithTitle
)并使用removeIf
,如上所述。< / p>
答案 3 :(得分:0)
只需覆盖equals
课程中的Library
方法,如下所示。
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj == this) return true;
if(obj instanceof Library) {
Library lib = (Library) obj;
return this.books.equals(lib.books);
}
return false;
}
从ArrayList
中删除元素时,请使用以下代码。
books.remove(new Library("The Gunslinger"));
这将有效。
您无法从String
删除ArrayList<Library>
元素。
有关详细信息,请参阅this问题。
答案 4 :(得分:0)
让我们来看看你在尝试什么。
ArrayList
ArrayList
从remove(String s)
中删除其中一个对象。首先,没有remove(String s)
。您的代码实际调用的是remove(Object o)
。即使String
是Object
,此方法确实期望的Object
是您的Library
对象,这就是为什么您的答案表明您必须覆盖{ {1}}和equals()
另一种方法是使用您自己的自定义类(hashCode()
)扩展ArrayList类,该类具有Library
个对象,并实现Book
。
至于“标题:”只在结果中出现一次,@ Override toString()就是为了这个。
remove(String s)
扩展Library
的自定义类:
ArrayList
public static class Library extends ArrayList<Book> {
// Adding an overload remove method that accepts a String
public void remove(String book) {
// Find the book to remove
for (int i = 0; i < size(); i++) {
if (get(i).getTitle().equals(book)) {
// This remove() is one of the default remove methods
// that is part of an ArrayList
remove(i);
break;
}
}
}
// This will display "Titles: " once along with every
// book in the ArrayList
@Override
public String toString() {
StringBuilder sb = new StringBuilder("Titles: ");
// Append each book to the returning String
forEach(book -> sb.append(book).append("\n"));
return sb.toString();
}
}
自定义类:
Book
用法:
public static class Book {
private String title;
public Book(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
@Override
public String toString() {
// You could append additional information like
// author, publisher, etc...
return title;
}
}
结果:
public static void main(String[] args) throws Exception {
Library books = new Library();
books.add(new Book("The Gunslinger"));
books.add(new Book("The Drawing of the Three"));
System.out.println("After add: ");
System.out.println(books);
books.remove("The Gunslinger");
System.out.println("After remove: ");
System.out.println(books);
}