我有一些代码。
@Override
public void handle(ActionEvent event) {
System.out.println(counter.get(0));
fileHolder.remove(counter.get(0));
try {
FileWriter writer = new FileWriter("videoGameDatabase.txt");
for (int i=0;i<fileHolder.size();i++) {
writer.write(fileHolder.get(i));
if(i < fileHolder.size()-1) writer.write("\r\n");
}
writer.close();
} catch (IOException ex) {
Logger.getLogger(FinalProject.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
在这里,我试图删除数组列表中的元素。当我尝试使用此按钮删除条目时,它不起作用。计数器的第一个元素的值是1.
然而,当我这样做时:
fileHolder.remove(1);
它完全正常,但两个值都是1.
为什么第一个不起作用但第二个起作用?
答案 0 :(得分:1)
一个字:Autoboxing。 Java Collections Framework自动将原始值与其对应的对象一起使用,例如:在int
存储Integer
之前,Collection
会自动加框为ArrayList
。这会导致使用List<Integer>
时出现歧义,因为有两种删除方法,即remove(int)
和remove(Object)
。
解决方案:在使用remove
时,您应该使用显式强制转换来调用正确的ArrayList<Integer>
方法。
list.remove((Integer)x)
list.remove((int)x)
注意:请勿使用list.remove(new Integer(x))
。每次调用它时,这都会不必要地创建一个新的Integer
实例。相反,使用显式强制转换(如上所示)或Integer.valueOf
方法;这两者都利用了自动装箱缓存。
答案 1 :(得分:0)
请查看Javadocs for ArrayList。 ArrayList有两个删除方法,其中一个采用int
,并在索引处删除。另一个需要Object
。
如果您在ArrayList
中存储了整数,然后尝试通过int
删除,则会删除索引,而不是对象< / em>的
您需要仔细查看返回内容的代码。如果counter.get(0)
返回一个int,那么您将删除指定索引处的对象。
答案 2 :(得分:0)
我无法看到你如何从数组中读取/存储值。也许有一个问题 - 阅读永远是第一价值......