我知道这是一个非常基本的问题,但我已经搜索过,但没有为我的问题找到合适的答案。我有一个从扫描仪填充的对象ArrayList。当我尝试打印出列表中的所有元素时,我只会将最后一个元素作为列表中的对象重复多次。
首先是Object类:
public class Colors {
String name;
@Override
public String toString(){
return name.toString();
}
}
现在是主要班级:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Vec {
public static void main(String[] args) {
Colors col= new Colors();
List <Colors> l = new ArrayList<>();
boolean flag = true;
while(flag == true){
System.out.println("Type in name of color");
Scanner kb = new Scanner (System.in);
col.name = kb.next();
l.add(col);
for (int j= 0; j<l.size();j++) {
Object g = (Object)l.get(j);
System.out.println("Name of color: "+g);
}
}
}
}
我究竟做错了什么?
答案 0 :(得分:3)
您使用new
关键字在Java中声明对象。您只是声明了Colors
的一个实例,然后一遍又一遍地更改其名称。然后一遍又一遍地将相同的Colors
添加到列表中。您需要做的是更改声明Colors
的位置,这可以在while
声明中完成。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Vec
{
public static void main(String[] args) {
List <Colors> l = new ArrayList<>();
boolean flag = true;
Scanner kb = new Scanner (System.in);
while (flag) {
System.out.println("Type in name of color");
Colors col = new Colors ();
col.name = kb.next();
l.add(col);
for (int j = 0; j<l.size();j++) {
Object g = (Object)l.get(j);
System.out.println("Name of color: "+g);
}
}
}
}
这里的区别在于col
现在在while
语句的本地范围内重新声明。
小笔记,这些都是偏离主题的,针对的是codereview,而不是回答这个问题。
while (flag == true)
,无需与true
进行比较。您也无需始终创建新的Scanner
。
我建议为变量使用更好的名称。 l
,col
,kb
,flag
基本上可以是任何内容。
一些建议(他们只是建议):
Colors
,现在Colors
也具有误导性,因为它只有一种颜色,我建议将类名更改为Color
将l
列为colors
。scanner
。running
,playing
,on
。另外一个问题是,由于您知道l
商店的内容,因此您可以使用for
代替商店。
for (Colors c : l) {
System.out.println("Name of color: " + c);
}