Arraylist没有正确删除对象?

时间:2016-04-16 21:29:59

标签: java

我有一些代码。

     @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.

为什么第一个不起作用但第二个起作用?

3 个答案:

答案 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)

我无法看到你如何从数组中读取/存储值。也许有一个问题 - 阅读永远是第一价值......