Java如何从ArrayList中计算图书总评分并获取评分最高的前10本
问题排查与修正方案
核心错误点
- 总分变量
sum定义在双层循环外,所有图书的评分都会叠加到同一个变量上,处理每本新书前没有重置为0 - 输出逻辑放在了内层评论遍历循环中,每匹配到一条评论就会触发一次输出,而非当前图书所有评论统计完成后再输出
- 类属性获取方法名写错:
Book和Reviews类中定义的id获取方法是getIdbook(),代码中错误使用了getIdlibro() - 集合变量名不统一:定义的图书集合是
book、评论集合是top,循环遍历的时候错误使用了未定义的mybook、mytop
修正后代码
public static void main(String[] args) { // 图书集合 ArrayList<Book> bookList = new ArrayList<Book>(); Book book1 = new Book(123,"Dante Aligueri","Planet"); Book book2 = new Book(456,"Virginia Wolf","Planet"); bookList.add(book1); bookList.add(book2); // 评论集合 ArrayList<Reviews> reviewsList = new ArrayList<Reviews>(); Reviews top1 = new Reviews(1,123,9); Reviews top2 = new Reviews(2,123,9); Reviews top3 = new Reviews(3,123,9); Reviews top4 = new Reviews(4, 456,10); reviewsList.add(top1); reviewsList.add(top2); reviewsList.add(top3); reviewsList.add(top4); // 遍历每本图书统计总分 for (int i = 0; i < bookList.size(); i++) { // 每本图书的总分单独定义,每次处理新书初始化为0 int sum = 0; int currentBookId = bookList.get(i).getIdbook(); for (int j = 0; j < reviewsList.size(); j++) { if (currentBookId == reviewsList.get(j).getIdbook()) { sum += reviewsList.get(j).getRating(); } } // 内层循环结束,当前图书所有评论统计完成后再输出 System.out.println("book id: " + currentBookId + " total rating: " + sum); // 如果是UI组件赋值,不要直接覆盖原有内容,改为追加即可 // tops.setText(tops.getText() + "\nbook id: " + currentBookId + " total rating: " + sum); } }
优化建议
如果图书和评论数量较大,双层循环的时间复杂度是O(n*m),可以先遍历评论集合,用HashMap<Integer, Integer>存储每本图书id对应的总分,再遍历图书集合匹配总分,时间复杂度可以降到O(n+m),运行效率更高。
内容的提问来源于stack exchange,提问作者Jose Alexander Rios 3Palacios
相关产品推荐
相关产品推荐

