JavaのTreeSetコレクションにカスタムタイプを格納


TreeSetコレクションには、カスタムタイプが格納されます.
1、TreeSetストレージ要素が自動的に小さいものから大きいものに並べ替えられていることはよく知られていますが、ストレージはカスタムタイプですか?
小さいものから大きいものまで並べ替えられますか?テストしてみましょう.データを保存すると異常が放出されます.自動ソートは言うまでもありません.
//運転放出異常:java.lang.ClassCastException:class Person cannot be cast to class java.lang.Comparable.
//この異常は、PersonタイプはComparableタイプに変換できません.このComparableはableで終わり、明らかにインタフェースです.
2、だからシステムは私たちがComparableタイプに変換できることを要求して、つまりPersonクラスにComparableインタフェースを実現することを要求して、Personクラスの比較規則を定義します.
では、ComparableインタフェースのcompareToメソッドを書き換えるにはどうすればいいのでしょうか.
テストコード:
import java.util.*;

public class Test07 {
     
    public static void main(String[] args) {
     
        //   TreeSet  
        Set<Person> people = new TreeSet<>();

        //   Person  
        /*people.add(new Person(30, "zhangsan"));
        people.add(new Person(20, "lisi"));
        people.add(new Person(10, "wangwu"));*/
        //       :java.lang.ClassCastException: class Person cannot be cast to class java.lang.Comparable
        //       :Person       Comparable  ,  Comparable able  ,      
        //              Comparable  ,     Person    Comparable  ,       Person      

        //   Comparable    
        people.add(new Person(30, "zhangsan"));
        people.add(new Person(20, "lisi"));
        people.add(new Person(10, "wangwu"));
        System.out.println(people.size());  // 3

        //   people,         
        for (Person p : people) {
     
            System.out.print(p + "   ");
            //      : 10-wangwu   20-lisi   30-zhangsan
            //      : 20-lisi   10-wangwu   30-zhangsan
        }
        System.out.println();

    }
}

class Person implements Comparable<Person> {
     
    int age;
    String name;

    public Person() {
     

    }
    public Person(int age, String name) {
     
        this.age = age;
        this.name = name;
    }

    //       
    /*public int compareTo(Person p) {
        return age - p.age;  //    :    ,    
        //return p.age - age  //    :    ,    
        //return 0;  //   0     
    }*/

    //       
    public int compareTo(Person p) {
     
        return name.compareTo(p.name);  //   String     ,  
        //return p.name.compareTo(name);  //        
        //return 0;  //         
    }

    //   toString()  
    public String toString() {
     
        return age + "-" + name;
    }

}

まとめ:
1、TreeSetのストレージは無秩序に繰り返してはいけない、nullを保存してはいけない.保存した要素は自動的に小さいから大きいまで並べ替えられる.
2、TreeSetセットに格納された要素は、Comparableインタフェースを実装し、比較のルールを手動で書き換える必要があります.