首页 > 解决方案 > 如何为包含 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;
    }
}

标签: javafor-loopsearcharraylistswitch-statement

解决方案


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

为了比较,您是否要使用book.getGenre().equals(genre)或是一个口味问题book.getGenre() == genre。请注意并注意第二种形式仅适用于枚举,不适用于其他对象。它适用于枚举,因为编译器保证每个枚举常量只有一个实例。第一种形式适用于所有类型的对象(也包括枚举)。

......所以如果这是一个愚蠢的问题或者我完全错了,请原谅我。

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


推荐阅读