2011-02-24 40 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 最佳实践的类,这都是给定的。