ArrayList排序报错:bookList未实现Comparable接口问题求助
问题分析
你遇到的错误是因为bookList类没有实现Comparable接口,Java的Collections.sort()默认需要待排序的对象类实现这个接口,这样它才知道如何比较两个bookList实例的大小关系。
解决方案
有两种常用的解决方式,根据需求选择即可:
方式一:让bookList类实现Comparable接口
修改bookList类,实现Comparable<bookList>并重写compareTo方法,指定按书名(title)排序的逻辑:
public class bookList implements Comparable<bookList> { public String title, author, genre; public bookList (String beginTitle, String beginAuthor, String beginGenre) { title = beginTitle; author = beginAuthor; genre = beginGenre; } public String getTitle(){return title;} public String getAuthor(){return author;} public String getGenre(){ return genre;} public void setTitle(String titleUpdate){title = titleUpdate;} public void setAuthor(String authorUpdate){author = authorUpdate;} // 注意:原方法名错误,应为setGenre而非setPubDate public void setGenre(String genreUpdate){genre = genreUpdate;} @Override public String toString() { return "title: " + title + '\t'+ "author: " + author + '\t'+ "genre: " + genre + "\n"; } // 重写compareTo方法,按title字典序排序 @Override public int compareTo(bookList otherBook) { return this.title.compareTo(otherBook.title); } }
修改后直接调用Collections.sort(toRead)就能正常按书名排序。
方式二:调用sort时传入自定义Comparator
如果不想修改bookList类结构,可以在排序时传入Comparator对象指定规则,用Lambda表达式更简洁:
if (userResponse == 2) { // 按title排序,传入自定义比较逻辑 Collections.sort(toRead, (book1, book2) -> book1.getTitle().compareTo(book2.getTitle())); // 排序后输出结果,让用户看到效果 System.out.println(toRead); }
这种方式更灵活,后续要按作者或类型排序,只需修改Lambda内的比较逻辑即可。
额外提示
- 你的
bookList类存在方法名错误:setPubDate实际用于修改genre,建议改名为setGenre避免混淆。 - 排序完成后记得输出
toRead列表,否则无法展示排序结果。
内容的提问来源于stack exchange,提问作者Gwen Murtha
相关产品推荐
相关产品推荐

