java - 如何为包含 switch 语句的搜索方法返回 ArrayList
问题描述
我只写了三个月的代码,如果这是一个愚蠢的问题或者我完全搞错了,请原谅我。我有一种方法来搜索书籍的 ArrayList。该方法应返回具有指定流派的所有书籍的新 ArrayList。我有一个 Enums 类 BookGenre,并试图在增强的 for 循环中使用 switch 语句将书籍添加到列表中。我得到一个列表,其中包括所有书籍的名称,而不仅仅是喜剧的名称。谁能告诉我哪里出错了?
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
。请注意并注意第二种形式仅适用于枚举,不适用于其他对象。它适用于枚举,因为编译器保证每个枚举常量只有一个实例。第一种形式适用于所有类型的对象(也包括枚举)。
......所以如果这是一个愚蠢的问题或者我完全错了,请原谅我。
这是一个很好的问题,我不认为你把事情完全弄错了。不过,您的思维方式可能会有所改进,这就是您成为学习者的原因(我们都是,或者至少应该是)。虽然可以使该语句switch
起作用,但在这里使用它并不是一个好主意。第一,将所有体裁一视同仁更容易:将其与每本书的体裁进行比较。许多现实生活中的程序已经停止正常工作,因为它们在枚举上使用,并且有一天添加了第三个枚举常量,该常量不在语句中,因此没有考虑在内。switch
switch
推荐阅读
- file - 通过 Tidtrivialftp 发送 JPG 时出现问题。收到的文件为 0KB
- javascript - 单击按钮后引导模式不起作用
- jquery - 动态元素未附加到 on() 函数?
- javascript - 在 redux 状态的对象中添加或删除对象
- jenkins - 如何将构建工件的快照版本上传到 Artifactory 中的 gradle 存储库
- bash - 如何通过aws UserData在bash中确认lets-encrypt --dry-run测试
- java - 我在 Spring Boot 中遇到了 bean 的问题
- android - 如何在 SQL 数据库中插入多行
- flutter - 无法访问 flutter.dev (Mac OS)
- mysql - 具有排除项的多表条件联接