JavaでのSetの詳細
38913 ワード
Set:要素は無秩序(格納と取り出しの順序が必ずしも一致しない)であり、要素は繰り返してはいけない.この集合体系にはインデックスがないからだ.Set集合の機能Collectionは一致しており、取り出すには反復器---HAshSet:下位データ構造はハッシュテーブルであり、スレッドは非同期である(サブクラスが秩序化を実現でき、LinkedHashSet(チェーンテーブル構造とhas構造が結合されている)----TreeSet:Setセット内の要素をソート(自然ソート、小さいから大きい)することができる下位層のデータ構造は二叉木であり、スレッドは同期しない
HashSetコレクション:
HashSetはどのように要素の唯一性を保証するか(要素の同じ根拠を判断する):要素の2つの方法,hashCodeとequalsによって完成する
-要素のHashCode値が同じ場合、equalsがtrueであるかどうかを判断します.-要素のhashcode値が異なる場合、equalsは呼び出されません.
要素の有無や削除などの判断には,要素のhashcodeとequalsメソッドが依存する.
ハッシュセットにカスタムオブジェクトを格納.名前と年齢は同じ人で、要素を繰り返します.
要素をHashSetコレクションに格納する場合は、hashCodeメソッドとequalsメソッドを上書きする必要があります.
一般的に、定義されたクラスでは、人間、学生、本など、多くのオブジェクトが生成されます.通常、equals、hashCodeメソッドを上書きする必要があります.オブジェクトが同じかどうかを判断する根拠を確立する.
LinkedHashSet(チェーンテーブル構造とhas構造を組み合わせた):変数集合の要素が秩序化される(ここでいう秩序化は順序ではなく、どのように保存されるかという順序が取り出す順序と同じである)
TteeSet:
要素の一意性を判断する方法:比較方法の戻り結果が0であるかどうか、0であるかどうか、同じ要素であり、保存されない.
TreeSetが要素をソートする方法1:要素自体に比較機能を持たせるには,メタがComparableインタフェースを実現する必要がある.compareToメソッドを上書きします.
需要:TreeSetコレクションにカスタムオブジェクトを格納します.年齢順に並べ替える
要素自体が比較性を備えていない場合、あるいは備えた比較性が必要でない(Personクラスのコードを変更することはできませんが、自分で書いたものではない可能性があります)この場合、コンテナ自体に比較性を持たせる必要がありますTreeSetコレクションの2つ目のソート方式2:コレクション自体に比較機能を持たせ、クラス実装Comparatorインタフェースを定義し、comparareメソッドを上書きします.このクラスオブジェクトをパラメータとしてTreeSetコレクションのコンストラクション関数に渡します.
両方のソートが存在する場合、比較器を主とする(クラスを定義し、comparatorインタフェースを実現し、compareメソッドを上書きする
どのようにTreeSetを秩序化させるか:比較の中ですべて1を返して、return 1;
ツリーの原理図:
文字列の長さで並べ替えます.文字列自体は比較性を備えているが、彼の比較方法は必要ではない.この場合はコンパレータしか使用できません
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 }