2011-01-14 8 views
5
import java.util.*; 
public class DuplicateCheckMain { 
public static void main(String[] gopal){ 
    Integer[] args = {6,9,2,55,100,1,6,8,9}; 
    Integer[] args1 = {3,6,2,3,5}; 
    Set S = new HashSet(); 
    DuplicateCheck.checkDuplicate(S,args,new String("HashSet")); 
    Set S1 = new HashSet(); 
    DuplicateCheck.checkDuplicate(S1,args1,new String("HashSet")); 

    S = new TreeSet(); 
    DuplicateCheck.checkDuplicate(S,args,new String("TreeSet")); 

    S = new LinkedHashSet(); 
    DuplicateCheck.checkDuplicate(S,args,new String("LinkedHashSet")); 

} 
} 

public class DuplicateCheck { 

public static void checkDuplicate(Set S, Integer[] args, String setname){ 
    for(int i = 0;i<args.length;i++){ 
    if(!S.add(args[i])){System.out.println("Duplicate element "+args[i]);} 
    } 
    System.out.println(S +" "+ setname); 
} 
} 

質問:参照SのHashSetの場合、HashSetはソートされません。しかし、リファレンスS1の場合、HashSetはソートされます。なぜそうなのか?HashSetがソートしていませんか?

+0

コードタグを使用してください。それはより読みやすくなります! –

+0

出力を提供してください。 –

+0

出力:重複要素6 重複素子9 [1、100、2、55、6、8、9] HashSetの 重複素子3 [2、3、5、6] HashSetの 重複素子6 重複要素9 [1,2,6,8,9,51,100] TreeSet 重複する要素6 重複する要素9 [6,9,2,555,100,1,8] LinkedHashSet – Gopal

答えて

5

HashSetです。絶対にはソートされていません。ご注文はで、すべてに保証されていません。 iterator()方法の文書化から

は、このセットの要素の反復子を返します。要素は特定の順序で返されます。

HashSetは、要素の存在を非常に迅速に挿入し、等価でチェックするように設計されています。それで全部です。

並べ替えが必要な場合は、TreeSetまたはConcurrentSkipListSetなど、SortedSetの実装を使用する必要があります。

3

HashSetのはargs1アレイ全数のバケットエントリ

に番号を格納するためにMODを使用未満16 - デフォルトのHashSetのサイズ。それがソートされてしまうのです。

+0

その場合、mainへのコマンドライン入力時にソートされないのはなぜですか?配列番号が16より小さい配列を返します。 – Gopal

+0

@gopal "コマンドライン入力をメイン"コードに投稿してください...他の回答が指摘するように、 'HashSet'はソートを保証しません**。決してない。私はちょうど 'args1'の状況でなぜそれが分類されたのか説明していました。 –

0

HashSetはソートを保証しません。ソート機能を使用するには、TreeSetなどを使用してください。

0

java.util.Setは、「重複しない要素」を保証します。

java.util.SortedSetは、順序付けと「重複要素なし」を保証します。

3

新しい要素を挿入すると、並べ替えが保証されないため、HashSetの繰り返し順序が完全に変更されることがあります。例えば:単一要素の挿入が完全に順序を変更する方法

[1, 100, 2, 55, 6, 8, 9] 
[1, 100, 2, 3, 55, 66, 6, 37, 7, 8, 9, 13] 
[1, 2, 100, 3, 6, 66, 7, 37, 8, 42, 9, 13, 55] 

お知らせ:

public class TestHashSet { 
    public static void main(String[] foo) { 
     Set<Integer> set = new HashSet<Integer>(); 
     set.addAll(Arrays.asList(new Integer[] {6,9,2,55,100,1,6,8,9})); 
     System.out.println(set); 
     set.addAll(Arrays.asList(new Integer[] {7,3,13,37,66})); 
     System.out.println(set); 
     set.add(42); 
     System.out.println(set); 
    } 
} 

は私に次のような出力を与えました。

関連する問題