JavaでのSetの詳細

38913 ワード

Set:要素は無秩序(格納と取り出しの順序が必ずしも一致しない)であり、要素は繰り返してはいけない.この集合体系にはインデックスがないからだ.Set集合の機能Collectionは一致しており、取り出すには反復器---HAshSet:下位データ構造はハッシュテーブルであり、スレッドは非同期である(サブクラスが秩序化を実現でき、LinkedHashSet(チェーンテーブル構造とhas構造が結合されている)----TreeSet:Setセット内の要素をソート(自然ソート、小さいから大きい)することができる下位層のデータ構造は二叉木であり、スレッドは同期しない
 
 
HashSetコレクション:
 1 import java.util.HashSet;

 2 import java.util.Iterator;

 3 

 4 public class HashSetDemo {

 5     public static void main(String[] args) {

 6         HashSet hs = new HashSet();

 7         /*

 8         sop(hs.add("java01"));   true

 9         sop(hs.add("java01"));   false,  java01          

10         */

11         hs.add("java01");

12         hs.add("java02");

13         hs.add("java02");//     false,        java02       

14         hs.add("java02");

15         hs.add("java03");

16         hs.add("java04");

17 

18         //set                 

19         for (Iterator it = hs.iterator(); it.hasNext();) {

20             System.out.println(it.next()); 

21         }

22     }

23 }

HashSetはどのように要素の唯一性を保証するか(要素の同じ根拠を判断する):要素の2つの方法,hashCodeとequalsによって完成する
-要素のHashCode値が同じ場合、equalsがtrueであるかどうかを判断します.-要素のhashcode値が異なる場合、equalsは呼び出されません.
要素の有無や削除などの判断には,要素のhashcodeとequalsメソッドが依存する.
 
ハッシュセットにカスタムオブジェクトを格納.名前と年齢は同じ人で、要素を繰り返します.
 1 import java.util.*;

 2 public class HashSetTest{

 3 

 4     public static void main(String[] args) {

 5         HashSet hs = new HashSet();

 6 

 7         hs.add(new Person("a1",11));

 8         hs.add(new Person("a2",12));

 9         hs.add(new Person("a3",13));

10         hs.add(new Person("a2",12));

11         hs.add(new Person("a4",14));

12         

13         Iterator it = hs.iterator();

14         while (it.hasNext()){

15             Person p = (Person)it.next();

16             System.out.println(p.getName()+"::"+p.getAge());

17         }

18     }

19 }

20 

21 //          ,     hashCode equals  ,            HashSet   

22 class Person{

23     private String name;

24     private int age;

25     

26     public String getName() {

27         return name;

28     }

29     public void setName(String name) {

30         this.name = name;

31     }

32     public int getAge() {

33         return age;

34     }

35     public void setAge(int age) {

36         this.age = age;

37     }

38     

39     public Person(String name, int age) {

40         super();

41         this.name = name;

42         this.age = age;

43     }

44     

45     //

46     public int hashCode(){

47         //return 60;//      ,        ,   equals            

48         return name.hashCode()+age*27;//*27            ,        .             

49     }

50     //            

51     public boolean equals(Object obj){

52         if (!(obj instanceof Person))

53             return false;

54         

55         Person p = (Person)obj;

56         return this.name.equals(p.name) && this.age == p.age;

57     }

58 }

要素をHashSetコレクションに格納する場合は、hashCodeメソッドとequalsメソッドを上書きする必要があります.
一般的に、定義されたクラスでは、人間、学生、本など、多くのオブジェクトが生成されます.通常、equals、hashCodeメソッドを上書きする必要があります.オブジェクトが同じかどうかを判断する根拠を確立する.
 
LinkedHashSet(チェーンテーブル構造とhas構造を組み合わせた):変数集合の要素が秩序化される(ここでいう秩序化は順序ではなく、どのように保存されるかという順序が取り出す順序と同じである)
 1 import java.util.HashSet;

 2 import java.util.Iterator;

 3 import java.util.LinkedHashSet;

 4 

 5 public class LinkedHashSetDemo {

 6     public static void main(String[] args) {

 7 

 8         HashSet hs = new LinkedHashSet();

 9         

10         hs.add("hahah");

11         hs.add("hehe");

12         hs.add("heihei");

13         hs.add("xixii");

14         hs.add("hehe");

15         

16         Iterator it = hs.iterator();

17         

18         while(it.hasNext()){

19             System.out.println(it.next());

20         }

21     }

22 }

 
 
 
TteeSet:
 1 import java.util.Iterator;

 2 import java.util.TreeSet;

 3 

 4 public class TreeSetDemo {

 5     public static void main(String[] args) {

 6         TreeSet ts = new TreeSet();

 7 

 8         ts.add("cab");//                       

 9         ts.add("aab");

10         ts.add("dab");

11         ts.add("Bab");

12 

13         Iterator it = ts.iterator();

14         while (it.hasNext()){

15             System.out.println(it.next());

16         }

17     }

18 }

 
要素の一意性を判断する方法:比較方法の戻り結果が0であるかどうか、0であるかどうか、同じ要素であり、保存されない.
 
TreeSetが要素をソートする方法1:要素自体に比較機能を持たせるには,メタがComparableインタフェースを実現する必要がある.compareToメソッドを上書きします.
需要:TreeSetコレクションにカスタムオブジェクトを格納します.年齢順に並べ替える
 1 import java.util.Iterator;

 2 import java.util.TreeSet;

 3 

 4 public class TreeSetTest {

 5     public static void main(String[] args) {

 6         TreeSet ts = new TreeSet();// TreeSet            ,                

 7 

 8         ts.add(new Person("jianqing",18));

 9         ts.add(new Person("jianfeng",14));

10         ts.add(new Person("jianhuo",15));

11         ts.add(new Person("jianguang",17));

12 

13         Iterator it = ts.iterator();

14         while (it.hasNext()){

15             Person p = (Person)it.next();

16             System.out.println(p.getName()+"...."+p.getAge());

17         }

18     }

19 }

20 //             

21 class Person implements Comparable{

22     private String name;

23     private int age;

24     Person(String name,int age){

25         this.name = name;

26         this.age = age;

27     }

28     

29     public String getName(){

30         return name;

31     }

32     public int getAge(){

33         return age;

34     }

35     

36     //   Compareble      ,            ,               

37     public int compareTo(Object obj){

38         if (!(obj instanceof Person))

39             throw new RuntimeException("   ");

40         Person p  = (Person)obj;

41         if(this.age>p.age)

42             return 1;

43         if(this.age == p.age){

44             return this.name.compareTo(p.name);//   ,        ,          。      0             

45         }

46         return -1;

47     }

48 

49     public boolean equals(Object obj){

50         if (!(obj instanceof Person))

51             return false;

52 

53         Person p = (Person)obj;

54         return this.name.equals(p.name) && this.age == p.age;

55     }

56 }

 
要素自体が比較性を備えていない場合、あるいは備えた比較性が必要でない(Personクラスのコードを変更することはできませんが、自分で書いたものではない可能性があります)この場合、コンテナ自体に比較性を持たせる必要がありますTreeSetコレクションの2つ目のソート方式2:コレクション自体に比較機能を持たせ、クラス実装Comparatorインタフェースを定義し、comparareメソッドを上書きします.このクラスオブジェクトをパラメータとしてTreeSetコレクションのコンストラクション関数に渡します.
両方のソートが存在する場合、比較器を主とする(クラスを定義し、comparatorインタフェースを実現し、compareメソッドを上書きする
 1 import java.util.Comparator;

 2 import java.util.Iterator;

 3 import java.util.TreeSet;

 4 

 5 public class TreeSetTest{

 6     public static void main(String[] args) {

 7         TreeSet ts = new TreeSet(new MyCompare());//             TreeSet       。

 8 

 9         ts.add(new Person("jianqing",18));

10         ts.add(new Person("jianfeng",14));

11         ts.add(new Person("jianhuo",15));

12         ts.add(new Person("jianguang",17));

13 

14         Iterator it = ts.iterator();

15         while (it.hasNext()){

16             Person p = (Person)it.next();

17             System.out.println(p.getName()+"...."+p.getAge());

18         }

19     }

20 

21 }

22 class Person implements Comparable{//             

23     private String name;

24     private int age;

25     Person(String name,int age){

26         this.name = name;

27         this.age = age;

28     }

29 

30     public int compareTo(Object obj){//   Compareble             

31         if (!(obj instanceof Person))

32             throw new RuntimeException("   ");

33         Person p  = (Person)obj;

34         if(this.age>p.age)

35             return 1;

36         if(this.age == p.age){

37             return this.name.compareTo(p.name);

38         }

39         return -1;

40     }

41     

42     public String getName(){

43         return name;

44     }

45     public int getAge(){

46         return age;

47     }

48 

49 

50     public boolean equals(Object obj){

51         if (!(obj instanceof Person))

52             return false;

53 

54         Person p = (Person)obj;

55         return this.name.equals(p.name) && this.age == p.age;

56     }

57 }

58 //

59 class MyCompare implements Comparator{

60     public int compare(Object o1,Object o2){

61         Person s1 = (Person)o1;

62         Person s2 = (Person)o2;

63         int num = s1.getName().compareTo(s2.getName());

64 

65         if(num==0){

66             return (new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())));

67             /*

68             if(s1.getAge()>s2.getAge())

69                 return 1;

70             if(s1.getAge()==s2.getAge())

71                 return 0;

72             return -1;

73             */

74         }

75         return num;

76     }

77 }

どのようにTreeSetを秩序化させるか:比較の中ですべて1を返して、return 1; 
ツリーの原理図:
文字列の長さで並べ替えます.文字列自体は比較性を備えているが、彼の比較方法は必要ではない.この場合はコンパレータしか使用できません
 1 import java.util.Comparator;

 2 import java.util.Iterator;

 3 import java.util.TreeSet;

 4 

 5 class TreeSetTest{

 6     public static void main(String[] args) {

 7         TreeSet ts = new TreeSet(new StrLenComparator());

 8 

 9         ts.add("huangjianfeng");

10         ts.add("huangjianfei");

11         ts.add("huangjianfeng.java");

12         ts.add("huangjian");

13         ts.add("jianfeng");

14 

15         for (Iterator it = ts.iterator();it.hasNext() ; ){

16             System.out.println(it.next());

17         }

18     }

19 }

20 

21 class StrLenComparator implements Comparator{

22     public int compare(Object o1,Object o2){

23         String s1 = (String)o1;

24         String s2 = (String)o2;

25         /*

26         if(s1.length()>s2.length())

27             return 1;

28         if(s1.length()==s2.length())

29             return 0;

30         return -1;

31         */

32 

33         int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));

34         if(num==0)//        ,       (  String    ,         String)

35             return s1.compareTo(s2);

36 

37         return num;

38     }

39 }