2011-04-27 84 views
1

我有下面的代碼,我需要看看是否有重複,如果有,然後只刪除它的一個實例。如果只有一個實例,它仍然被刪除。我知道我不得不使用計數器並調整陣列大小,但我不確定如何。如何刪除java中數組中參數的一個實例?

Listable[]newitems = new Listable[items.length-1]; 
for(int i = 0;i<items.length;i++){ 
    if(items[i]!=itemToRemove){ 
     break; 
    } 
    else{ 
     for(int j = i;j<items.length-1;++j){ 
      newitems[j] = items[j+1]; 
     } 
    } 
    items = newitems; 
} 

回答

0

我認爲break是扔掉東西,因爲它會立即終止循環。是continue你想要什麼呢?乍一看,其餘大部分代碼看起來都可以工作。但是當你在for循環中設置items = newItems會發生什麼?

+0

哦,如果沒有參數的實例,那麼該方法什麼都不做,所以我假設休息會去那裏?不完全確定。 – Sathish 2011-04-27 23:47:25

+0

我原來的回覆中有一個錯誤...我只是編輯並修復了它。 – NateTheGreat 2011-04-27 23:50:25

1

您需要遍歷數組,直到找到要移除的元素的實例,然後分配一個新數組(因爲它需要更短)並複製所有,但將要從原始移除的項目移至新陣列。您的代碼在第一個不是您想要刪除的項目後停止。試試這個:

Listable[] newitems = items; // default in case itemToRemove isn't found 
for (int i = 0; i<items.length; i++) { 
    if (items[i] == itemToRemove) { 
     newitems = new Listable[items.length - 1]; 
     System.arraycopy(items, 0, newitems, 0, i); 
     System.arraycopy(items, i+1, newitems, i, items.length - i - 1); 
     break; 
    } 
} 
items = newitems; 

這可能是更好地使用items[i].equals(itemToRemove)代替==,根據要求。

1

使用LinkedHashSet。 Set是一個不包含重複元素的集合。 LinkedHashSet允許您維護數組順序。如果訂購不重要,只需使用HashSet。

Set<Listable> set = new LinkedHashSet<Listable>(); 
for(Listable l : items) { 
    set.add(l); 
} 
Listable[] newitems = set.toArray(new Listable[set.size()]); 

這樣可以節省複製陣列多次,但依賴於equals和正常工作可列的hashCode方法,以便能夠區分獨特的元素。

0

如果我正確地閱讀了您的描述,那麼您只需要在列表中保留兩次或更多次的項目。

// count the instances 
    LinkedHashMap<Listable,Integer> map = new LinkedHashMap<Listable, Integer>(); 
    for(int i = 0; i < items.length; i++) { 
     int count = 1; 
     if (null != map.get(items[i])) { 
      count += map.get(items[i]); 
     } 
     map.put(items[i], count); 
    } 

    // add it to the new list if the count is more than 1 
    ArrayList newList = new ArrayList<Listable>(); 
    Iterator it = map.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry pairs = (Map.Entry)it.next(); 
     if (((Integer)pairs.getValue()) > 1) { 
      newList.add(pairs.getKey()); 
     } 
    } 
    return newList.toArray(); 
相關問題