将唯一对象实例添加到ArrayList中的方法不起作用



首先:我是Java和这个网站的新手,这是我在这里的第一篇文章。我在谷歌和这个网站上搜索了我的问题,发现了一些(很多(类似的帖子,但我找不到一个能帮助我解决编码问题的。

我有两个类:图书馆图书。在过去的四个小时里,我一直在尝试编写一种方法,如果一本书是唯一的,就将它添加到Library(ArrayList(中。如果它不是唯一的,就会打印一条消息,说图书馆已经有了这本书。

类:

字段:

private ArrayList<Book> bookList;

构造函数:

bookList = new ArrayList<Book>();

方法:

public void addBook(Book bookTitle)
{
for(Book bookId:bookList) {
if (bookTitle.equals(bookId)) {
bookList.add(bookTitle);
System.out.println("Book registered."); }
else { System.out.println("This book is not unique"; }                
} 

}

我没有得到任何编译错误,但它不起作用。该对象不会添加到我的ArrayList中,也不会打印任何消息。我也尝试过:

if (bookId != bookTitle)

没有结果。

希望这里有人能帮我解释一下我做错了什么,我将不胜感激。

您似乎对IF语句中正在计算的表达式的作用感到困惑。你的if表达有效地说:;如果bookTitle与bookList中的一个匹配(即是重复的(";做X,否则做Y。

";do X";分支机构说";添加书";booklist.add(bookTitle)——当它是重复的——这是错误的。

";做Y";你的if分支说(更正语法(:System.out.println("This book is not unique");,对bookList没有影响

相反,我交换了两个分支XY->YX所以你应该有:

public void addBook(Book bookTitle){
for(Book bookId : bookList) {
if (bookTitle.equals(bookId)) {
System.out.println("This book is not unique");
break; // breaks out of the surrounding for-loop
// stop checking books if we enter this branch
} else {
bookList.add(bookTitle);
System.out.println("Book registered."); 
// keep checking more books if we enter this branch
}                
} 
}

研究告诉我们,代码嵌套得越多,错误发生的可能性就越大,因为逻辑更难消化。

我试着把它拆开,想出了:

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
class LibraryApplication {
static Library library;
public static void main(String[] args) {
library = new Library();
addBook(new Book("Title 1"));
addBook(new Book("Title 1"));
addBook(new Book("Title 2"));
library.printAllBooks();
}
public static void addBook(Book bookTitle){
if (library.isBookInLibrary(bookTitle)) {
System.out.println("This book (" + bookTitle.getTitle() + ") is not unique");
} else {
library.add(bookTitle);
System.out.println("Book " + bookTitle.getTitle() + " registered.");
}
}
}
class Book {
private String title;
public Book(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
// Called by Library's printAllBooks method (library.toString())
@Override
public String toString() {
return "Book{" +
"title='" + title + ''' +
'}';
}
// auto generated by IDE (important for checking whether a collection contains an equal object)
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Book)) return false;
Book book = (Book) o;
return title.equals(book.title);
}
// auto generated by IDE (important for checking whether a collection contains an equal object)
@Override
public int hashCode() {
return Objects.hash(title);
}
}
class Library {
List<Book> library = new ArrayList<Book>();
public boolean isBookInLibrary(Book book){
return library.contains(book);
}
public void add(Book book) {
library.add(book);
}
public void printAllBooks() {
System.out.println(library.toString());
}
}

输出:

Book Title 1 registered.
This book (Title 1) is not unique
Book Title 2 registered.
[Book{title='Title 1'}, Book{title='Title 2'}]

Process finished with exit code 0

最新更新