【问题标题】:ArrayList as Object attribute doesn't save valuesArrayList as Object 属性不保存值
【发布时间】:2018-02-06 22:02:40
【问题描述】:

我有一个对象,具有以下属性:

public class Club {

    private String name;
    private ArrayList<Integer> points;
    private int average;

    Club(String name, ArrayList<Integer> points, int average){
        this.name = name;
        this.points = new ArrayList<>();
        this.average = average;

我尝试用来自 txt 文件的数据点填充数组列表:

        while((currentLine = br.readLine()) != null){

            String name;
            ArrayList<Integer> points = new ArrayList<>();
            int average;
            String[] clubData = currentLine.split(",");
            name = clubData[0];

            int score2 = Integer.parseInt(clubData[2]);
            int score3 = Integer.parseInt(clubData[3]);
            int score4 = Integer.parseInt(clubData[4]);
            int score5 = Integer.parseInt(clubData[5]);

            points.add(score2);
            points.add(score3);
            points.add(score4);
            points.add(score5);

            average = points.stream().mapToInt(Integer::intValue).sum()/4;
            Club club = new Club(name, points, average);

当我打印对象时,我得到了这个:

Name: Clubname Points: [] Average: 6

因此,文件的值保存在列表中。因为平均值(6)是计算出来的,这是好的值。但是,对象本身的列表“点”是空的。谁能给我解释一下?

【问题讨论】:

    标签: java arrays object arraylist


    【解决方案1】:

    您在 Club 类中的构造函数每次都创建一个新的 ArrayList。改成这个

    Club(String name, ArrayList<Integer> points, int average){
        this.name = name;
        this.points = points;
        this.average = average;
    

    【讨论】:

    • 或者如果Club 应该是不可变的,则使用addAll 复制传递列表的值。
    • 谢谢!如您所见,我对Java的经验不是很丰富。继续学习,谢谢:)
    【解决方案2】:

    您的构造函数忽略了points

    复制列表(浅拷贝):

    this.points = new ArrayList<>(points);
    

    或保留对现有列表的引用:

    this.points = points;
    

    此外,您目前正在使用 Java 的整数除法来计算平均值。在这里看起来它成功了,因为您并没有抱怨平均值不正确,但通常您希望将您的 average 保留为 double 并除以 double 文字,4.0:

    average = points.stream().mapToInt(Integer::intValue).sum()/4.0;
    

    此外,IntStream 为您提供平均计算。 The average method returns an OptionalDouble:

    average = points.stream().mapToInt(Integer::intValue).average().getAsDouble();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多