如何返回包含switch语句的搜索方法的ArrayList



我只编码了三个月,所以如果这是一个愚蠢的问题,请原谅我,或者我完全错了。我有一个方法来搜索图书的数组列表。该方法应该返回一个包含指定类型的所有图书的新ArrayList。我有一个枚举类BookGenre,并试图在增强的for循环中使用开关语句将图书添加到列表中。我得到一个列表,其中包括所有书的名字,而不仅仅是喜剧的名字。谁能告诉我我哪里做错了?

public static void main(String[] args) {
ArrayList<Book> books = new ArrayList<Book>();
Book book1 = new Book("Book one", BookGenre.COMEDY);
Book book2 = new Book("Book two", BookGenre.THRILLER);
Book book3 = new Book("Book three", BookGenre.THRILLER);
ArrayList<Book> books = new ArrayList<Book>();
books.add(book1);
books.add(book2);
books.add(book3);
//search by genre
ArrayList<Book> booksByGenre = searchByGenre(books, BookGenre.COMEDY);

for (Book book : booksByGenre) {
System.out.println(book.getName());
}
}
public static ArrayList<Book> searchByGenre(ArrayList<Book> books,
BookGenre genre) {
ArrayList<Book> searchList = new ArrayList<Book>();
for (Book book : books) {
switch (genre) {
case COMEDY:
searchList.add(book);
break;
case THRILLER:
searchList.add(book);
break;
}
}
return searchList;
}
}

您的Book应该有一个getGenre方法,可能不像这样命名,而是一个将其BookGenre返回给调用者的方法。然后,对于每本书(即在增强的for循环中),如果书的类型等于搜索的类型,则将其添加到searchList中,否则不添加。您需要一个if语句,而不是switch-case语句。

作为比较,您是想使用book.getGenre().equals(genre)还是book.getGenre() == genre,这是一个个人喜好的问题。需要注意的是,第二种形式只适用于enum,而不适用于其他对象。它适用于枚举,因为编译器保证每个枚举常量只有一个实例。第一种形式适用于所有类型的对象(也包括枚举)。

…所以原谅我,如果这是一个愚蠢的问题,或者我得到的东西完全错误的。

这是一个好问题,我不认为你完全错了。你的思维方式可以有所改进,不过,这就是为什么你是一个学习者(我们都是,或者至少应该是)。虽然可以使switch语句起作用,但在这里使用它并不是一个好主意。首先,把所有的体裁都一视同仁更容易:将其与每本书的体裁进行比较。许多现实生活中的程序已经停止正常工作,因为它们在枚举上使用了switch,并且有一天添加了第三个枚举常量,而这个常量不在switch语句中,因此没有考虑到。

最新更新