2016-01-10 96 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)」的複雜度 –

相關問題