Java处理CSV图书列表按书名字母序排序异常问题咨询
问题根因
你当前代码中按书名排序不生效的最直接原因是排序执行顺序覆盖了结果:你先调用Collections.sort(books, new Book.SortByTitle());完成书名排序后,紧接着又执行了Collections.sort(books, new Book.SortByAuthor());按作者排序,最终集合里保存的是按作者排序后的结果,打印自然看不到书名排序的效果。
排查&解决步骤
- 首先验证书名排序逻辑是否正常:注释掉按作者排序的代码,只保留书名排序后重新运行,看输出是否符合字典序排序要求
Collections.sort(books, new Book.SortByTitle()); //title // 注释掉这行,避免排序结果被覆盖 // Collections.sort(books, new Book.SortByAuthor()); //author - 若注释后排序仍不符合预期,再排查以下可能性:
- 书名首尾是否存在空格/不可见字符:CSV读取时可能带入多余空白字符,导致
compareTo结果不符合预期,可修改比较逻辑去除空白后再比较:static class SortByTitle implements Comparator<Book> { @Override public int compare(Book b1, Book b2) { // 先判空再去除首尾空白,避免空指针 String t1 = b1.title == null ? "" : b1.title.trim(); String t2 = b2.title == null ? "" : b2.title.trim(); return t1.compareTo(t2); } } - 是否需要忽略大小写排序:默认
compareTo是区分大小写的,如果需要不区分大小写可以换成compareToIgnoreCase - 集合类型是否为可变集合:如果
books是不可变集合(比如通过List.of生成的),排序操作不会生效,需要先转成可变集合如ArrayList再执行排序
- 书名首尾是否存在空格/不可见字符:CSV读取时可能带入多余空白字符,导致
- 如果你需要先按作者排序、作者相同再按书名排序的多维度排序,不要分开两次调用sort,而是直接使用复合比较器:
Collections.sort(books, new Book.SortByAuthor().thenComparing(new Book.SortByTitle()));
可选代码优化
如果你的books集合已经指定了泛型为List<Book>,遍历的时候不需要强转,直接调用getter即可:
books.forEach(t -> System.out.println(t.getTitle()));
内容的提问来源于stack exchange,提问作者Henrique Demetrio
相关产品推荐
相关产品推荐

