Java_まとめ15(集合-Setインタフェース-Setでよく使われる2つの実装クラスHashSet,TreeSet)

18412 ワード

一、Setインタフェース
SetインタフェースはCollectionインタフェースの追加の方法を提供していないが、Setインタフェースを実装する集合クラスの要素は重複しない.
 
二、HashSet集合クラス
--HashSetは要素の追加順序を保存しません.
--HashSetは要素のハッシュコードに基づいて格納され、取り出す際にもハッシュコードに基づいて素早く見つけることができる.
--HashSetに要素を追加する場合、システムは重複しないことを保証するためにhashCode()を比較し、同じ場合equals()を比較し、同じ場合は同じオブジェクトとみなし、追加しない、add(...)falseを返します.
--[Demo]HashSetセットに格納するカスタムタイプのオブジェクトは、通常hashCode()メソッドとequals()メソッドを書き換える必要があります.
--同じオブジェクトのhash値は必ず同じであり、同じhash値は必ずしも同じオブジェクトではなく、さらには異なるオブジェクトである可能性があります.
 
HashSetオブジェクトの格納、hashCode()とequals()の書き換え方法の例
public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    //  hashCode()  
    @Override
    public int hashCode() {
        
        return this.name.hashCode() + this.age;//  age       hashCode,     
    }
    
    //  equals()  
    @Override
    public boolean equals(Object obj) { //= p
//        this.name      .name
//        this.age        .age

        //        obj  null       false                  
        if(obj == null){
            return false;
        }
        
        //                             true
        if(obj == this){
            return true;
        }
        
        if(obj instanceof Person){
            Person paramter = (Person)obj;
            if(this.name.equals(paramter.name) && this.age == paramter.age){
                return true;
            }
        }
        
        return false;
    }
}
import java.util.HashSet;

public class Test11 {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet<>();
        hashSet.add(new Person("  ", 12));
        hashSet.add(new Person("  ", 12));
        hashSet.add(new Person("  ", 14));
        hashSet.add(new Person("  ", 12));
        System.out.println(hashSet);
    }
}

実行結果:
[Person [name=  , age=12], Person [name=  , age=14], Person [name=  , age=12]]

 
三、TreeSet集合クラス
--TreeSetは、赤と黒のツリー構造を使用して、追加された要素を並べ替えて保存します.出力は、並べ替え後の順序になりますので、TreeSetに入れる要素は「並べ替え可能」でなければなりません.
--TreeSetコレクションのjavabeanクラス自体に参加するには、Comparable['k]を実装します.ɑmpərəbl]インタフェース
--インプリメンテーションをカスタマイズします.ɑmpə,retɚ]インタフェースのコンパレータ実装クラスは、TreeSetオブジェクトを作成するときにカスタムコンパレータを構築方法に入力します.
--追加されたクラス「比較不可」の場合、add()メソッドは実行時にエラーを報告します.
 
すべてのソート可能なクラスはjavaを実装する必要があります.lang.Comparableインタフェース
このインタフェースを実装する唯一の方法:public int compareTo(Object obj);この方法は
(this:新規オブジェクト;obj:コレクションに既に存在するオブジェクト)
--は0を返し、this==objを表し、集合に参加しない
--正の数を返します.this>objを表します.thisは大きく後ろに置きます.
--負の数を返します.this 
Comparableインタフェースの実装例
package chapter.three;

import java.text.CollationKey;
import java.text.Collator;

public class Person implements Comparable{
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    @Override
    public int compareTo(Person o) {
        //
        if (this.age > o.age) {
            return 1;
        }else if (this.age < o.age) {
            return -1;
        }else {
            //      ,     ,        
            CollationKey key1 = Collator.getInstance().getCollationKey(this.name);
            CollationKey key2 = Collator.getInstance().getCollationKey(o.name);
            int num = key1.compareTo(key2);
            if (num > 0) {
                return 1;
            }else if (num < 0) {
                return -1;
            }else {
                return 0;//  0      
            }

       // , return o1.getName().compareTo(o2.getName()); } } }
import java.util.HashSet;
import java.util.TreeSet;

public class Test11 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet<>();
        treeSet.add(new Person("  ", 14));
        treeSet.add(new Person("  ", 12));
        treeSet.add(new Person("  ", 12));
        treeSet.add(new Person("  ", 19));
        for (Person person : treeSet) {
            System.out.println(person);
        }
    }
}

実行結果:
Person [name=  , age=12]
Person [name=  , age=12]
Person [name=  , age=14]
Person [name=  , age=19]

 
Comparatorインタフェースを実装するコンパレータ実装クラスをカスタマイズ
import java.text.CollationKey;
import java.text.Collator;

public class Person/* implements Comparable*/{
    private String name;
    private int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
//      
import java.text.CollationKey;
import java.text.Collator;
import java.util.Comparator;

public class MyComparator implements Comparator{

    @Override
    public int compare(Person o1, Person o2) {
        //
        if (o1.getAge() > o2.getAge()) {
            return 1;
        }else if (o1.getAge() < o2.getAge()) {
            return -1;
        }else {
            //      ,     ,        
            CollationKey key1 = Collator.getInstance().getCollationKey(o1.getName());
            CollationKey key2 = Collator.getInstance().getCollationKey(o2.getName());
            int num = key1.compareTo(key2);
            if (num > 0) {
                return 1;
            }else if (num < 0) {
                return -1;
            }else {
                return 0;//  0      
            }
        }
    }
}
import java.util.TreeSet;

public class Test11 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet<>(new MyComparator());
        treeSet.add(new Person("  ", 14));
        treeSet.add(new Person("  ", 12));
        treeSet.add(new Person("  ", 12));
        treeSet.add(new Person("  ", 19));
        for (Person person : treeSet) {
            System.out.println(person);
        }
    }
}

実行結果:
Person [name=  , age=12]
Person [name=  , age=12]
Person [name=  , age=14]
Person [name=  , age=19]

 
転載先:https://www.cnblogs.com/liujianliang/articles/6858234.html