2016-01-10 93 views
14

我正在学习使用集合。我的问题是:集不包含重复。当我们尝试插入重复项时,它不会抛出任何错误并自动删除重复项。在插入set之前检查每个值是否是一种好习惯?还是可以做一些类似下面的代码?我认为Java会在内部使用.contains(value)进行检查。你怎么看?如果您在插入集合之前检查重复项目

考虑到有n元素进入集合,这两种情况下的大O复杂度是什么?

import java.util.HashSet; 
import java.util.Set; 

public class DuplicateTest { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Set<Integer> mySet = new HashSet<Integer>(); 

     mySet.add(10); 
     mySet.add(20); 
     mySet.add(30); 
     mySet.add(40); 
     mySet.add(50); 
     mySet.add(50); 
     mySet.add(50); 
     mySet.add(50); 
     mySet.add(50); 
     mySet.add(50); 

     System.out.println("Contents of the Hash Set :"+mySet); 
    } 

} 
+0

因为'HashSet'由'HashMap'支持,所以你的答案可以在这里找到:http://stackoverflow.com/a/4553642/4490686 –

+2

它不会做一个'contains'而是它只是赢了添加一个已经存在的元素,即它不会添加任何开销来执行此操作。 –

+1

仅供参考,您无法通过添加与已应用相同复杂度的其他操作来更改Big Oh复杂性。我的意思是,这两个'for(int x:set){set.add(x); }和'for(int x:set){set.contains(x);} set.add(X); }'只要'add'和'contains'具有相同的复杂性,就具有相同的Big Oh复杂性。因为O(C * n)== O(n),对于任何常数C. – user3707125

回答

16

作为每docs

public boolean add(E e)

如果指定的元素不存在,则将该元素添加到此集合中。更正式地说,如果该集合不包含元素e2,使得(e == null?e2 == null:e.equals(e2)),则将指定的元素e添加到该集合。 如果此集合已包含该元素,则该呼叫将保持集合不变并返回false。

所以add()方法已经返回给你一个true或false。所以你不需要做额外的检查。

4

它确定不检查。这是列表集合的主要优势,因为它们会自动过滤出重复项目。

HashSet的具有恒定的时间性能(http://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html

这个类提供了基本操作(添加,删除,包含和大小)固定的时间性能,假定哈希函数将适当分散的元素桶

+1

@YassinHajaj - 已经链接到APIi并提供相关部分。 – DMozzy

9

the API documentation of Set.add(E)

比较The add方法检查元件已经在Set。如果该元素已经存在,则不添加新元素,并且Set保持不变。在大多数情况下,你不需要检查任何东西。

该方法的复杂性取决于您正在使用的Set的具体实现。

2

add函数返回一个布尔值,您可以检查该布尔值以确定该项是否已经在Set中。这当然是基于您的需求,并不是最佳实践。要知道它不会删除已经存在的项目,所以如果您正在根据数据库中的代理键定义equals,则无法使用新信息更新现有值。这与地图工作方式相反,因为地图将返回任何现有值并将其替换为新值。

1

以下是问题的答案:

当我们尝试插入重复,它不会引发任何错误和 自动删除重复项。

您的理解不正确。如果Set.add()已经在集合中,则不会添加新项目;本声明适用于Set的所有实施,包括HashSetTreeSet

在插入集 之前检查每个值是否是一种好的做法是否存在?或者是否可以执行类似以下 的代码?我认为java会在内部使用 .contains(value)进行检查。你怎么看?

由于您的理解从一开始就不正确,因此您无需在插入到集合之前检查每个值以查看它是否已经存在。是的,在内部,它正在做类似。

考虑到 有“n”个元素进入集合的情况,在这两种情况下都会有多大的复杂度?

对于HashSet,每个add()的时间复杂度为O(1)。对于TreeSet() - 您没有使用 - 时间复杂度为O(lg N),每个add()

+1

如果散列算法不是最优的,则HashSet可以具有“O(n)”的复杂度 –

相关问题