将变量存储在数组中

时间:2014-10-10 07:39:24

标签: java arrays

我有一些代码从数组中读取一行字符,将字符分配给一个整数然后平均该行的所有整数,它对数组中的每一行执行此操作。由于我是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进行解决方案。如果有人能指出我正确的方向,我将不胜感激。

3 个答案:

答案 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;