public static void main(String args[]){
new Converter();
//the converter() method reads a csv file that pass it to an array of String
// called stringList; where in stringList is a static variable;
ArrayList<Student> list = new ArrayList<Student>(5);
String p[] = null;
Student stud = null;
for(int z = 0; z < stringList.length; z++){
p = stringList[z].split(",");
id = Integer.parseInt(p[0]);
yr = Integer.parseInt(p[5]);
fname = p[1];
gname = p[2];
mname = p[3].charAt(0);
course = p[4];
stud = new Student(id,yr,fname,gname,mname,course);
studs = stud;
我试图显示上面变量的当前值,并将其与学生对象进行比较
System.out.println(id +" "+ yr +" "+ fname + " "+gname + " "+mname + " "+course +" should be the same with : " +stud.toString());
list.add(studs); // add the student object to the list
} //end of the for loop
然后我注意到我的Arraylist仅显示一个值:
for (int c = 0; c<list.size(); c++){
System.out.println(" @list "+c+": "+list.get(c));
}
} // end of main method
通常我会阅读100多个项目,但在此示例中,我仅阅读了5个项目;这是程序的输出;
2123259 1 AVILA JEREMY RAYMUND T BSIT should be the same with : 2123259,AVILA,JEREMY RAYMUND,T,BSIT,1
2124919 1 BEROÑA MAYNARD W BSIT should be the same with : 2124919,BEROÑA,MAYNARD,W,BSIT,1
2124679 1 CABRERA JERSON RHOD D BSIT should be the same with : 2124679,CABRERA,JERSON RHOD,D,BSIT,1
2124905 1 CABRILLAS ARMANDO JR. B BSIT should be the same with : 2124905,CABRILLAS,ARMANDO JR.,B,BSIT,1
2123400 1 CARIÑO JVANZ S BSIT should be the same with : 2123400,CARIÑO,JVANZ,S,BSIT,1
@list 0: 2123400,CARIÑO,JVANZ,S,BSIT,1
@list 1: 2123400,CARIÑO,JVANZ,S,BSIT,1
@list 2: 2123400,CARIÑO,JVANZ,S,BSIT,1
@list 3: 2123400,CARIÑO,JVANZ,S,BSIT,1
@list 4: 2123400,CARIÑO,JVANZ,S,BSIT,1
现在,女士们,先生们,我的问题是,我尝试显示Stud对象以检查其读取的值是否正确,并且确实显示正确,然后在为其分配值之后,将其添加到列表中。但是有些事情使我感到困惑,并且我无法弄清楚为什么我的列表中只包含数组中的最后一项?请帮助我,我被困了两个晚上。
这是我的整个代码,我主要关注
公共类转换器{
private static ArrayList<Student> students;
private static String[] stringList;
private static Scanner fr;
private static int size;
private static int id;
private static int yr;
private static String fname;
private static String gname;
private static char mname;
private static String course;
public static void main(String args[]){
ArrayList<Student> list = new ArrayList<Student>(5);
new Converter();
String p[] = null;
Student stud = null;
students = new ArrayList<Student>(stringList.length);
for(int z = 0; z < stringList.length; z++){
p = stringList[z].split(",");
id = Integer.parseInt(p[0]);
yr = Integer.parseInt(p[5]);
fname = p[1];
gname = p[2];
mname = p[3].charAt(0);
course = p[4];
stud = new Student(id,yr,fname,gname,mname,course);
System.out.println(id +" "+ yr +" "+ fname + " "+gname + " "+mname + " "+course +" should be the same with : " +stud.toString());
list.add(stud);
} // end of for loop
for (int c = 0; c<list.size(); c++){
System.out.println(" @list "+c+": "+list.get(c));
} // end of second loop
}// end of main
public Converter(){
readStudtentsCSV();
id = 0;
yr = 0;
fname = "";
gname = "";
mname = ' ';
course = "";
}
public static void readStudtentsCSV() {
int s = 0;
try {
size = countLines("test.csv");
stringList = new String[size];
fr = new Scanner(new File("test.csv"));
} catch(Exception e){
e.printStackTrace();
}
while (fr.hasNextLine()){
stringList[s] = fr.nextLine();
//System.out.println(stringList[s]);
s++;
}
}
public static int countLines(String eFile) throws Exception{
Scanner fScan = new Scanner(new File(eFile));
int count =0;
while (fScan.hasNextLine()){
count += 1;
String line = fScan.nextLine();
}
fScan.close();
return count;
}
}
问题是您在Student
课程中的字段是static
。您尚未显示代码,但可以这样猜测:
public class Student {
private static int id;
//other fields...
//constructor...
//getters and setters...
}
只需static
从此类的字段中删除标记即可。
public class Student {
//field must not be static
private int id;
//other non-static fields...
//constructor...
//getters and setters...
}
请注意,删除class static
字段中的标记 不会解决问题* 。Converter
*
简而言之,static
字段属于类,而非static
字段属于类对象引用。如果static
您的Student
类中包含字段,则所有对象引用将共享该值。当具有非static
字段时,由于它们属于该类的每个实例,因此每个对象引用_将_ 具有不同的值。
更多信息:了解实例和类成员
我正在向一个ArrayList中添加三个不同的对象,但该列表包含我添加的最后一个对象的三个副本。 例如: 预期: 实际: 我犯了什么错误? 注意:这是针对本网站上出现的众多类似问题而设计的一个规范问答。
问题内容: 下面有一个for循环代码。我通过调用一个自定义显示函数发现aBook arrayList对象仅添加了最后一个类对象三次。为什么会这样呢? 这是我的LiFiAddressBook类 } 问题答案: 由于使用static关键字,每次 调用构造函数时,旧值都会被新值覆盖,并且在打印列表中的元素时,LiFiAddressBook类的对象变量将指向相同的对象。因此打印相似的对象。 需要明确的是,
我正在使用OpenCV一段时间,现在我需要这种类型的乘法: 定义一个矩阵,其中包含类型为1的元素。矩阵的大小为:M X N。矩阵必须与Vector相乘,Vector的大小为:N X 1,包含双
文件输入。txt由两行组成:第一行是整数N空格,然后是整数K(1 ≤ N、 K级≤ 250000). Second有N个空间除数的整数,其中每个整数都小于或等于K。保证从1到K的每个整数都在数组中。任务是找到包含所有整数的最小长度的子数组。并打印其开始和结束。请注意,索引从1开始。 示例: 我在最近的一次编程比赛中完成了这个任务。一切都结束了,我没有作弊。我已经使用python 3实现了它: 这个
问题内容: 我目前有一个数据框,其中包含以1和0作为值的列,我想遍历这些列并删除仅由0组成的列。到目前为止,这是我尝试过的: 在哪几年是我正在分析的不同年份的数据帧的列表,其中包括其中包含一个的列,而零则是包含所有零的列的列表。是否有更好的方法根据条件删除列?由于某些原因,我必须检查一列是否也位于零列表中,并将它们从零列表中删除,以获得所有零列的列表。 问题答案: df.loc[:, (df !=
然后是班级选拔: 教材: 因此,我主要创建新用户并将其序列化: 一切都很完美,但如果我这样做: 然后我想序列化对象用户,程序崩溃了。我得到的结果是: JAVA木卫一。NotSerializableException:在java上。木卫一。ObjectOutputStream。java上的WriteObject 0(ObjectOutputStream.java:1183)。木卫一。ObjectOu