You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:06:03