2013-08-10 4 views
1

Я пишу программу, которая читает из файла. Каждая строка в файле содержит информацию о студенте. Каждый студент представлен объектом из класса «Студент». Класс Student имеет метод getName, который возвращает имя студента. Метод, который проходит через файл, возвращает и ArrayList, содержащий объекты студента. Моя проблема в том, что каждый раз, когда я использую цикл for для доступа к ArrayList и получаю имя каждого ученика, то, что я получаю, является именем последнего ученика в списке. Метод, который проходит через файл, называется «FileAnalyzer». Ниже приведен мой код.Как я могу исправить вывод из ArrayList?

import java.io.*; 
import java.util.ArrayList; 
import java.util.List; 

public class StudentStats { 

public static void main(String[] args) { 

    List<Student> example = null; 
    example = FileAnalyzer("C:\\Users\\achraf\\Desktop\\ach.csv"); 

    for (int i = 0; i < example.size(); i++) 
    { 
     System.out.println(example.get(i).getName()); 
    } 

} 

public static List<Student> FileAnalyzer(String path) //path is the path to the file 
{ 
    BufferedReader br = null; 
    List<Student> info = new ArrayList<Student>(); 
    String line = ""; 

    try { 
     br = new BufferedReader (new FileReader(path)); 

     while ((line = br.readLine()) != null) 
     { 
      //We create an object "Student" and add it to the list 

      info.add(new Student(line)); 

     } 

     } 

    catch (FileNotFoundException e) { 
     System.out.println("Aucun fichier trouvé"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

    return info; 
} 

В случае, если вам это нужно, вот код для класса студента

// This class create objects for each student 

public class Student { 

    private static String Name =""; 
    private static String Sex = ""; 
    private static String Grade = ""; 

    //constructor 
    public Student(String infos) 
    { 
     String [] etudiant = infos.split(","); 

     Name = etudiant[0]; 
     Sex = etudiant[1]; 
     Grade = etudiant[2];    
    } 

    // Getter functions 

    public String getName() 
    { 
     return Name; 
    } 
    public String getSex() 
    { 
     return Sex; 
    } 
    public String getGrade() 
    { 
     return Grade; 
    } 

} 

Ниже приводится содержание типичного файла, который считывает программы.

lovett,M,12 
Achos,F,23 
Loba,M,24 

Реальная проблема заключается в том, что после того, как работает мой код, чтобы получить имена, я получаю имя «Loba» три раза вместо того, чтобы все имена.

ответ

3

Здесь проблема в вашем Student классе:

private static String Name =""; 
private static String Sex = ""; 
private static String Grade = ""; 

Вы должны удалить static из переменных-членов в противном случае все объекты будут одни и те же атрибуты, и, следовательно, вы видите только последние значения, записанные в тех переменные всегда.

Узнайте больше о экземпляра и переменные класса здесь: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

+0

Большое вам спасибо! Вы заслуживаете медали! В следующий раз я должен быть более осторожным! – akinfermo

2

Ваши переменные-члены объявлены static в классе Student. Это означает, что они существуют как один экземпляр всей вашей программы, а не как один экземпляр на экземпляр, который вам нужен. Каждый раз, когда вы создаете нового ученика, вы указываете имя, пол и класс на что-то новое, но эти значения не связаны с каким-либо конкретным учеником. Все учащиеся разделяют эти атрибуты, и они переписываются в вашем цикле чтения файлов, поэтому все, что является фамилией в вашем файле, будет именем статических переменных.

+0

Спасибо так много! Вы заслуживаете медали! В следующий раз я должен быть более осторожным! – akinfermo

+0

Без проблем, рад я мог бы помочь, @OladodjaGbadamassi. – Kon

Смежные вопросы