2011-02-24 55 views
1

可能重複:
Remove duplicates from a list方法來刪除重複的名單

有沒有在Java中列出的任何方法,我可以用它來刪除重複?

+0

也許你應該首先使用Set而不是List。 – tanyehzheng 2011-02-24 06:23:11

+0

這不是回答這裏: http://stackoverflow.com/questions/2849450/remove-duplicates-from-a-list – Friedrich 2011-02-24 06:22:52

+0

我真的很喜歡諷刺的是,有關刪除重複的問題已被刪除...因爲這是一個重複的問題。 – gutch 2011-02-24 09:48:49

回答

1

沒有,沒有方法java.lang.List刪除重複項。看來,設計師預計List不會在你擔心重複的場景中:

set不同,列表通常允許重複的元素。更正式地說,列表通常允許E1元素對和e2,使得e1.equals(E2),它們通常允許多個null元素,如果他們允許的null元素。這是不難想象,有人可能希望實現禁止複製,當用戶試圖插入拋出運行時異常的列表,但我們希望這種用法是罕見的。

(從java.lang.List Javadoc拍攝)

你要麼需要使用Set或實現刪除重複自己的方法。

1

簡短的回答:沒有,沒有。 List接口支持標準列表結構模型和標準列表不關心重複項。因此:List沒有一個抽象的removeDuplicate()什麼的。

你可以實現自己的列表中,不允許添加重複。後臺列表是一個ArrayList:

public class SetList<T> implements List<T> { 
    private List<T> internal = new ArrayList<T>(); 

    // some constructors 

    // all adding methods and contructors do a check first 
    // example: 

    public SetList<T>(Collection<T> others) { 
    for (T other:others) 
     add(other); // adds all items except duplicates 
    } 

    @Override 
    public void add(T item) { 
    if (!internal.contains(item)) 
     return internal.add(item); 
    else 
     return false; 
    } 

    // other methods simply delegate to the internal list 
    // examples: 
    @Override 
    public void clear() {internal.clear();} 

    @Override 
    public Iteratory<T> iterator() {return internal.iterator();} 
} 

加法 - 你甚至可以添加Set接口,比你有,保持插入順序一組實施。


注 - 用相同的技術,你可以實現一個自定義的List - 又一個真實ArrayList支持,即提供了一個額外的方法來刪除重複(從後臺列表)

+0

是否有任何預定義的方法來刪除列表中的重複項 – kishore 2011-02-24 06:39:32

0

如果元素的順序是非常重要的,你可能要考慮實例化一個LinkedHashSet,通過你的清單給它的構造。然後,您可以調用此LinkedHashSet的迭代器將按原始順序爲您提供所有列表項,但刪除了重複項。

0

沒有內置方法可以從List中刪除重複項。

的選項有:

  • 使用一組,而不是一個列表......只要你不關心你的原始列表中的元素的順序。

  • 使用不允許按照@Andreas_D所述插入重複項的列表方法。

  • 重建列表按下面的代碼:

    List list = new ArrayList();  
    for (Object obj: inputList) { 
        if (!list.contains(obj)) { 
         list.add(obj); 
        } 
    } 
    

    這是O(N^2)因爲list.contains(obj)O(N)

  • 重建列表按下面的代碼:

    List list = new ArrayList(); 
    HashSet seen = new HashSet(); 
    for (Object obj: inputList) { 
        if (!seen.add(obj)) { 
         list.add(obj); 
        } 
    } 
    

    這是O(N),如果你做出關於散列函數的行爲的某些假設。

還有其他的變化。

警告,基於Collection類的所有解決方案都需要某些方法是由你的元素類正確/實現一致。但是,對於任何遵循Java 最佳實踐的類,這都是給定的。