我有一个对象,具有以下属性:
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文件的数据填充arraylist:
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),这是好的值。但是,列表&#39;点&#39;对象本身是空的。谁能解释一下这个?
答案 0 :(得分:1)
Club类中的构造函数每次都会创建一个新的ArrayList。将其更改为此
Club(String name, ArrayList<Integer> points, int average){
this.name = name;
this.points = points;
this.average = average;
答案 1 :(得分:0)
您的构造函数忽略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();