2013-06-21 71 views
0

我在製作返回數組列表的不同整數的方法時遇到問題。我真的想要刪除重複,然後只顯示數組列表。我找不出什麼問題。當我測試出來,這是輸出我得到:3,11,33,10]數組列表中的唯一整數

這是我的代碼

package getUniques; 

import java.util.ArrayList; 

public class Uniques { 

    public static ArrayList<Integer> getUniques(ArrayList<Integer> list){ 
     int i = 0; 
     while(i < list.size() - 1){ 

      for (int j = 0; j < list.size(); j++){ 

       if (list.get(i) == list.get(j)) 
        list.remove(i); 
      } 
      i++; 
     } 

     return list; 
    } 

    public static void main(String[] args) { 
     ArrayList<Integer> list = new ArrayList<Integer>(); 
     list.add(3); 
     list.add(3); 
     list.add(5); 
     list.add(11); 
     list.add(22); 
     list.add(33); 
     list.add(22); 
     list.add(10); 
     System.out.println(getUniques(list)); 
    } 

} 
+0

得睡,但把'int'值'Integer'在'Set'。然後檢查'int'是否在'Set'中。如果是,請刪除該值。最好使用'for ... next'循環(即'Iterator') –

回答

0

您的代碼有幾個問題。以下是針對您現有代碼的修復程序:

首先,您要刪除錯誤的索引。您已將j的元素標識爲重複項;刪除它而不是在i的元素。

list.remove(j); // j not i 

接下來,要刪除所有元素是一樣的,你是不會離開的「原始」。要解決這個問題,只能測試(並刪除)那些在循環中已經過去i的內容。

for (int j = i + 1; j < list.size(); j++){ // Start at i + 1, not 0. 

然後,你需要重試你的j指數一旦你刪除它,因爲該元素的其餘部分已經向後移動1點。取而代之的

if (list.get(i) == list.get(j)) 
    list.remove(i); 

嘗試

if (list.get(i) == list.get(j)) 
{ 
    list.remove(j); 
    j--; // Try this j again next loop, once it's incremented again. 
} 
1

更改列表會遍歷它總是會引起疼痛! 說你刪除第3項(所以舊的第4成爲新的3) - 那麼你做我++,所以你實際上跳過了「舊的第4」元素。

可以跳過i++如果去除,以重回正軌的項目,但其他一些 解決方案:

  1. 使用設置或類似擺在首位,所以你不能得到重複。

  2. 使用第二個列表來保存要 刪除項的值(或索引)(如果使用索引,可以從最高到最低 否則你最終得到了同樣的問題刪除:刪除索引1,索引4現在是 索引3 ...)

  3. 翻轉您的搜索,讓您回到0,同樣的主體 適用。您可以刪除較高的索引而不影響較低的索引。

  4. 使您的外循環使用迭代器,以便您可以使用刪除操作。

0

要刪除項目,而迭代,你必須使用一個迭代器,因爲它保證了順序:

Iterator<Integer> iterator = list.iterator(); 
int i = 0; 
List<Integer> listCopy = new ArrayList<Integer>(list); 
while(iterator.hasNext()){ 
    i++; 
    Integer value = iterator.next() 
    for (int j = i; j < listCopy.size(); j++){ 
     if (value.equals(listCopy.get(j))) { 
      iterator.remove(); 
     } 
    } 
} 

然而,在這種情況下,你需要通過相同的列表迭代兩次,這不是最好的解決方案。將所有內容放入已排序的Set中可能會更快,因爲Set會自行刪除重複項。

+0

i ++是複製/粘貼問題,很抱歉。但'iterator.remove()'只能刪除當前項目。 – MaQy

+0

這不起作用......刪除所有...並且您正在使用具有Integer的'=='.. -1直到修復 – nachokk

+0

您是對的,我編輯了一些功能,直到我想到更好的東西。 – MaQy

2

您還可以使用Set獲取唯一值。將值插入Set,然後將其放回ArrayList,如new ArrayList(theSet);

+1

這將刪除訂單。我不知道這是否可以接受。 –

+0

@owlstead然後你可以使用sortedset。 –

+2

您也可以查看'LinkedHashSet'來維護插入順序。 – JHS