删除List中重复项的方法

时间:2011-02-24 06:20:25

标签: java list

  

可能重复:
  Remove duplicates from a list

我可以使用Java List中的任何方法删除重复项吗?

4 个答案:

答案 0 :(得分: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接口,而不是保持插入顺序的set实现。


注意 - 使用相同的技术,您可以实现自定义List - 再次由真实ArrayList支持,它提供了一种额外的方法来删除重复项(从支持列表中)

答案 1 :(得分:1)

不,java.lang.List上没有删除重复项的方法。似乎设计人员预计List不会在您担心重复的情况下使用{/ p>}:

  

与集合不同,列表通常允许重复元素。更正式地,列表通常允许元素对e1和e2成为e1.equals(e2),并且如果它们根本允许空元素,则它们通常允许多个空元素。有人可能希望通过在用户尝试插入时抛出运行时异常来实现禁止重复的列表,这是不可想象的,但我们希望这种用法很少见。

     

(摘自java.lang.List Javadoc

您需要使用Set或实施自己的方法来删除重复项。

答案 2 :(得分:0)

如果元素的顺序很重要,您可能需要考虑实例化LinkedHashSet,将列表传递给它的构造函数。然后,您可以在此LinkedHashSet上调用的迭代器将按原始顺序为您提供所有列表项,但删除了重复项。

答案 3 :(得分:0)

没有内置方法可以从List中删除重复项。

您的选择是:

  • 使用Set而不是List ...只要您不关心原始列表中元素的顺序。

  • 使用不允许插入重复项的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 最佳实践的任何类,这都是给定的。