我正在尝试使用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。
答案 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