2015-02-10 54 views
1

我想要做的是從.txt文件中添加數字並將其拆分;到我的ArrayList listR2。到目前爲止它已經半工半讀,然而結果是隻有最後2人的分數被添加,第一人的分數剛剛變爲空。
我的拆分有問題嗎?拆分arraylist和文本文件

任何想法如何讓程序寫所有的分數?

+1

line.split(「[;]」)看起來很奇怪嗎?你是否真的這麼說 - 用[;]分割? – mkrakhin 2015-02-10 11:09:07

+0

@mkrakhin正則表達式''[[;]「'只是一種說法'';'''''。 – laune 2015-02-10 16:32:03

回答

0

它跳躍在你的代碼行(從文件),因爲你已經使用

for (int i = 3; i < itemStudent.length; i++) { 
    String test = studin.readLine(); //<--- this is the error 
    listR2.add(test); 
} 

而是使用

String test = itemStudent[i]; // to add the scores into the listR2 
0

首先,你的代碼:

BufferedReader studin = new BufferedReader(new FileReader(studentFile)); 
grader.Student student; 
student = new Student(); 
String line, eNamn, fNamn, eMail; 
ArrayList<String> listR = new ArrayList<String>(); 
ArrayList<String> listR2 = new ArrayList<String>(); 
//loop for the file and setters for first, lastname and email 
while ((line = studin.readLine()) != null) { 
    if (line.contains(";")) { 
     //# you don't need regex to split on a single specific character 
     String[] itemStudent = line.split("[;]"); 
     eNamn = itemStudent[0]; 
     fNamn = itemStudent[1]; 
     eMail = itemStudent[2]; 
     //#why are you using the Student object if you never use it in any way ? 
     //#also you are always updating the same "Student". if you expect to add it to say an ArrayList, 
     //#you need to declare a new student at the beginning of the loop (not outside of it) 
     student.setFirstName(fNamn); 
     student.setLastName(eNamn); 
     student.setEmail(eMail); 

     //Loop for the sum of the tests 
     Integer sum = 0; //# why Interger, the "int" primitive is more than sufficient 
     for (int index = 3; index < itemStudent.length; index++) { 
      try { 
       sum += Integer.parseInt(itemStudent[index]); 
       listR.add(itemStudent[index]); 
      } catch (Exception ex) {} //very bad practice, nerver silently drop exceptions. 
     } 
     //# that part is just wrong in many ways, I guess it's some left over debug/testing code 
     //# this also makes you skip lines as you will read as many lines as you have elements (minus 3) in itemStudent 
     /* 
     for (int i = 3; i < itemStudent.length; i++) { 
      String test = studin.readLine(); 
      listR2.add(test); 
     } 
     */ 
     System.out.println(eNamn + " " + fNamn + " " + eMail + " SUMMA:" + sum + " "); 
     //# you'll get a nice pointer address, but not it's values, you need to itterate the list to view it's content 
     System.out.println(listR2); 
    } 
} 

的/ /#標記我的評論 並在此處顯示對象方法的快速示例: (可能包含拼寫錯誤/缺少進口,但其他情況應該沒問題,編譯器應該會這麼做)。運行它: java main「your_file」

import java.util.ArrayList; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
public class Main { 
    public static void main(String[] args) { 
     class Student{ 
      String fname; 
      String lname; 
      String mail; 
      int sum; 
      Student(String fn,String ln,String ml){ 
       fname=fn; 
       lname=ln; 
       mail=ml; 
       sum=0; 
      } 
      void addScore(int n){ 
       sum += n; 
      } 
      public String toString() { 
       return "Student: "+fname+" "+lname+", "+mail+" sum: "+sum; 
      } 
     } 
     try { 
      BufferedReader br = new BufferedReader(new FileReader(args[0])); 
      ArrayList<Student> stdnts = new ArrayList<Student>(); 
      String line = br.readLine(); 
      while (line != null) { 
       if (line.contains(";")) { 
        String[] stdnt_arr = line.split(";"); 
        Student stdnt = new Student(stdnt_arr[0],stdnt_arr[1],stdnt_arr[2]); 
        for (int i = 3;i<stdnt_arr.length;i++){ 
         try { 
          stdnt.addScore(Integer.parseInt(stdnt_arr[i])); 
         } catch (NumberFormatException e) { 
          //not a number 
          e.printStackTrace(); 
         } 
        } 
        stdnts.add(stdnt); 
        System.out.println(stdnt.toString()); 
       } 
       line = br.readLine(); 
      } 
     } catch(IOException e){ 
      //things went wrong reading the file 
      e.printStackTrace(); 
     } 
    } 
}