2016-04-16 81 views
0

我有一些代码。Arraylist没有正确删除对象?

 @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

为什么第一个不能正常工作,但第二个呢?

+2

请更新问题以及重现问题所需的所有代码。请参阅http://stackoverflow.com/help/mcve。 – Radiodef

+0

你能告诉我们文件夹和计数器的类型吗?我想arraylist,但这种数据类型 – user43968

+0

可能相关:http://stackoverflow.com/questions/4534146/properly-removing-an-integer-from-a-listinteger –

回答

1

一个字:Autoboxing。 Java集合框架自动地将原始值与它们相应的对象相加,例如,在存储在Collection(如ArrayList)中之前,int被自动装箱为Integer。这会导致在使用List<Integer>时出现歧义,因为有两种删除方法,即remove(int)remove(Object)

解决方案:使用ArrayList<Integer>时,您应该使用显式强制转换来调用正​​确的remove方法。不要使用list.remove(new Integer(x))

  • 通过索引中删除

注当值

  • 使用list.remove((int)x)拆卸时使用list.remove((Integer)x)。每次调用时都会不必要地创建一个新的实例Integer。相反,使用显式强制转换(如上所示)或Integer.valueOf方法;这些都利用自动缓存的优势。

  • +0

    我试过这个: fileHolder.remove((Integer)counter.get(0)); 它仍然没有工作:/ – elemein

    +0

    您能否捕获返回值,如'boolean retVal = fileHolder.remove((Integer)counter.get(0));''。它是真的还是假的? –

    +0

    其实,我将整数改为int,它工作:) – elemein

    0

    请查看Javadocs for ArrayList。 ArrayList有两个删除方法,其中之一需要一个int,并删除索引。另一个需要Object

    如果您有存储整数在ArrayList,然后试图通过int去除,你会被指数,而不是对象删除。

    您需要仔细查看正在返回的代码。如果counter.get(0)返回一个int,则将删除指定索引处的对象。

    +0

    计数器确实返回一个int。我怎样才能删除元素? :/ – elemein

    +0

    @elemein,是返回应该被删除的*索引*的计数器吗?如果是这样,你应该可以执行'fileHolder.remove((int)counter)。得到(N));'。如果它返回应该被移除的*值*,你应该可以执行'fileHolder.remove((Integer)counter.get(n));'。虽然其他人可能会不同意,但我可能会更像'int idx = counter.get(n); fileHolder.remove((int)idx);'或'Integer val = counter.get(n); fileHolder.remove((Integer)val);'使目标和内容更清晰。 – KevinO

    0

    我看不到你如何读取/存储数组中的值。也许有一个问题 - 阅读总是第一个值....