2016-04-16 82 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

    我看不到你如何讀取/存儲數組中的值。也許有一個問題 - 閱讀總是第一個值....