我有一些代码从数组中读取一行字符,将字符分配给一个整数然后平均该行的所有整数,它对数组中的每一行执行此操作。由于我是java的新手,我在尝试将每行(gpa)的平均值存储在另一个数组中时遇到了麻烦。以下是我到目前为止的情况:
Scanner in = new Scanner(new File("Grades.txt"));
Scanner in2 = new Scanner(new File("Grades.txt"));
int size = 0;
while(in2.hasNextLine()) {
size++;
}
int count = 0;
double [] gpalist = new double[size] ;
while(in.hasNextLine()) {
size++;
double gp = 0;
double gpa = 0;
String line = in.nextLine();
double [] arraygpa = new double [7];
if(line.length() == 0) {
continue;
}
line = line.substring(line.length()-15, line.length());
String[] letters = line.split(" ");
for (int i = 0; i < letters.length; i++) {
if (letters[i].equals("H")) {
gp += 7;
}
else if (letters[i].equals("D")) {
gp += 6;
}
else if (letters[i].equals("C")) {
gp += 5;
}
else if (letters[i].equals("P")) {
gp += 4;
}
else if (letters[i].equals("F")) {
gp += 0;
}
}
gpalist[count++] = gp / letters.length;
System.out.println(Arrays.toString(gpalist));
}
这是当前的输出:
[5.75]
[6.75, 0.0]
[4.375, 0.0, 0.0]
[2.375, 0.0, 0.0, 0.0]
[4.125, 0.0, 0.0, 0.0, 0.0]
[4.5, 0.0, 0.0, 0.0, 0.0, 0.0]
[2.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
我试图将平均值(gpa)存储在另一个数组中,但我的尝试远非正确。不幸的是,禁止使用ArrayLists进行解决方案。如果有人能指出我正确的方向,我将不胜感激。
答案 0 :(得分:1)
如果您不确定文本文件中有多少行,请使用ArrayList
:
ArrayList<Double> gpaList = new ArrayList<Double>();
while(in.hasNextLine()) {
int gp = 0;
double gpa = 0;
String line = in.nextLine();
if(line.length() == 0) {
continue;
}
line = line.substring(line.length()-15, line.length());
String[] letters = line.split(" ");
for (int i = 0; i < letters.length; i++) {
if (letters[i].equals("H")) {
gp += 7;
}
else if (letters[i].equals("D")) {
gp += 6;
}
else if (letters[i].equals("C")) {
gp += 5;
}
else if (letters[i].equals("P")) {
gp += 4;
}
else if (letters[i].equals("F")) {
gp += 0;
}
}
gpaList.Add(gp / letters.length);
}
如果您坚持使用Array,那么您可以这样做,假设您的txt文件中的行数不超过8
int count = 0;
Double[] gpaList = new Double[8];
while(in.hasNextLine()) {
....
....
for (int i = 0; i < letters.length; i++) {
....
....
}
gpaList[count++] = gp / letters.length;
}
但是如果你不知道有多少等级,那么最近的解决方案就是先计算一行。
Scanner in = new Scanner(new File("Grades.txt"));
Scanner in2 = new Scanner(new File("Grades.txt"));
int size = 0;
while(in2.hasNextLine()) {
size++;
}
int count = 0;
Double[] gpaList = new Double[size];
while(in.hasNextLine()) {
....
....
for (int i = 0; i < letters.length; i++) {
....
....
}
gpaList[count++] = gp / letters.length;
System.out.println(Arrays.toString(gpalist));
}
答案 1 :(得分:1)
由于您可能事先不知道成绩的数量,因此这是ArrayList的一个很好的用例。
List<Double> gpas = new ArrayList<Double>();
while(in.hasNextLine()) {
int gp = 0;
double gpa = 0;
...
gpa = gp / letters.length;
gpas.add(gpa);
...
} // End while
如果稍后需要“简单”数组,ArrayList类有几个toArray方法。
<强>更新强>
如果每个学生有8个成绩,您可以使用该大小预先初始化数组,并在while循环之外保留索引变量:
double[] gpas = new double[8];
int index = 0;
while(in.hasNextLine()) {
int gp = 0;
double gpa = 0;
...
gpas[index] = gp / letters.length;
index++;
...
} // End while
答案 2 :(得分:0)
问题在于存储所有行值?如果是这样,您只需创建列表变量并在其中存储值。像这样:
List<Double> avrageGrades = new ArrayList<Double>();
然后当你有线路时,你就这样做:
avrageGrades.Add(gpa);
如果这是该功能,则可以在结束时返回avrageGrades。
但是如果你想要一个数组,那么你必须知道行的数量。你首先必须使用数量线。创建一个大小为行数的数组。然后在里面有一个计数器,这样你就可以知道你有哪一行然后就做了:
avrageGrades [line] = gpa;