ArrayList Iterator不显示任何数据

时间:2014-02-23 07:58:14

标签: java oop arraylist iterator thread-safety

我正在尝试使用Iterator显示ArrayList。我正在使用一个studentInfo类,它有各种fname,lname,instName等的getter-setter方法。但是,当我从main()调用displaydata()方法时,它不显示任何数据。我确认正在填充ArrayList。

另一段代码是一个接受文件数据并通过addStudentData()方法读入arraylist的线程。

interface inf_regStore {
    public void displayData();
public void addStudentData(String fname, String lname, String instName, int courseNo);
}

public class registrationStore implements inf_regStore{
    // create data structure and store the objects using vector or arraylist 


   public static ArrayList<studentInfo> stud = new ArrayList<studentInfo>();

    studentInfo sinfo;
    public void addStudentData(String fname, String lname, String instName, int courseNo)
    {
        sinfo = new studentInfo(fname, lname, instName, courseNo);
        stud.add(sinfo);
        System.out.println("Student Added\n");
    }


public void displayData(){
        Iterator<studentInfo> disp = stud.iterator();
        while(disp.hasNext()){
            System.out.println(disp.next().getFname());
            System.out.println(disp.next().getLname());
            System.out.println(disp.next().getInstName());
            System.out.println(disp.next().getCourseNo());
            System.out.println("Student Displayed\n");
        }
        //System.out.println("Student Displayed\n");
}

}

interface inf_readFile{
    public void readFile();
 }

// this is a thread class 
public class fileReader implements Runnable{
    // It reads the data file 
    BufferedReader input;
    registrationStore rs = new registrationStore();
    public fileReader() {
        try{
        File file = new File("dataFile.txt");
        input = new  BufferedReader(new FileReader(file));
    }
    catch(FileNotFoundException e)
    {
        System.out.println("File Not Found!");
    }
}

public void run(){
    readFile();
}

public void readFile(){

    try{

         String strline; 
         while((strline=input.readLine()) !=null){

                String[] details = strline.split(" ");
                //System.out.println(details[0]);
                rs.addStudentData(details[0], details[1], details[2], Integer.parseInt(details[3]));

        }

         input.close();

    }
    catch(IOException e){
        e.printStackTrace();
    }

}
}

编辑1:获得解决方案。由于我正在使用线程,我需要使用线程安全的数据结构。将Arraylist更改为Vector。

4 个答案:

答案 0 :(得分:3)

你打电话disp.next()太多次了。您只需在while循环中将其称为 一次 即可获取对象,然后从获取的对象中提取信息。这是有道理的,因为对disp.next()的调用应该与对disp.hasNext()的调用进行一对一配对,否则您在调用next()时无需知道hasNext()是否安全仍然是真的。

即,

public void displayData(){
    Iterator<studentInfo> disp = stud.iterator();
    while(disp.hasNext()){
        studentInfo sInfo = disp.next();
        System.out.println(sInfo.getFname());
        System.out.println(sInfo.getLname());
        System.out.println(sInfo.getInstName());
        System.out.println(sInfo.getCourseNo());
        System.out.println("Student Displayed\n");
    }
}

顺便说一句,您将需要学习并遵循Java命名约定。请注意,类,接口和枚举名称都以大写字母开头,而变量和方法名称都以小写字母开头。遵循这些约定将使您的代码更容易让其他人(我们!)理解并遵循它。

答案 1 :(得分:2)

一次调用disp.next();

        Iterator<studentInfo> disp = stud.iterator();
        while(disp.hasNext()){
            studentInfo info = disp.next();
            System.out.println(info.getFname());
            System.out.println(info.getLname());
            System.out.println(info.getInstName());
            System.out.println(info.getCourseNo());
            System.out.println("Student Displayed\n");
        }

答案 2 :(得分:0)

你多次调用disp.next()所以你得到不同对象的数据你要做的就是使用for-each或只调用一次.iterator

喜欢

     while(disp.hasNext()){
            studentInfo sInfo = disp.next();
             System.out.println(sInfo.getFname());
            System.out.println(sInfo.getLname());
            System.out.println(sInfo.getInstName());
            System.out.println(sInfo.getCourseNo());
            System.out.println("Student Displayed\n");
}

for(String sInfo : stud ){
    System.out.println(sInfo.getFname());
                System.out.println(sInfo.getLname());
                System.out.println(sInfo.getInstName());
                System.out.println(sInfo.getCourseNo());
}

答案 3 :(得分:0)

每次调用disp.next()迭代器前进一步时,都应该调用disp.next()一次,并使用局部变量来保存它

StudentInfo info = disp.next();
// then use the info instance