1. 程式人生 > 其它 >集合之Set【TreeSet】

集合之Set【TreeSet】

package com.Lucky;

import java.util.Iterator;
import java.util.TreeSet;

/**
 *    TreeSet:底層採用紅黑樹結構
 *           可排序【預設從小到大】/無重複/無索引
 *
 *
 *     注意點:1.在資料型別為數字型時,仍然按照從小到大排序
 *           2.在資料型別為char或String型別時,會根據ASCll編碼的數字大小排序【跟字典的26個字母排序相同】
 *
 */
public class TreeSetDemo {

    public static void main(String[] args) {
         //建立TreeSet集合
        TreeSet<Integer> ts=new TreeSet<>();
            TreeSet<TestDemo> tsStudent=new TreeSet<>();

        //新增元素
        ts.add(1);
        ts.add(5);
        ts.add(9);
        ts.add(4);
        ts.add(2);

        //遍歷輸出
        Iterator<Integer> ite = ts.iterator();
         while (ite.hasNext()){
             System.out.print(ite.next()+"\t");  //自動從小到大進行排序
         }

        System.out.println();
         ts.forEach(str-> System.out.print(str+"\t"));

        System.out.println();
        System.out.println("--------------排序習題-----------------");
        //建立TestDemo物件
        TestDemo tr=new TestDemo("黎唯易",22);
        TestDemo tr4=new TestDemo("黎新豐",32);
        TestDemo tr3=new TestDemo("黎易",26);
        TestDemo tr2=new TestDemo("黎唯易",22);


        System.out.println(tsStudent.add(tr)); //報異常:ClassCastException
        System.out.println(tsStudent.add(tr4));//在自定義的資料型別中不知道比較規則
        System.out.println(tsStudent.add(tr3)); //解決方法1:用javabean類實現Comparable介面,重新comparaTo()方法
        System.out.println(tsStudent.add(tr2));

       //遍歷資料
        for (TestDemo testDemo : tsStudent) {
            System.out.println(testDemo);
        }
    }
}

  TestDemo:

  
package com.Lucky;

import java.util.Objects;

public class TestDemo implements Comparable<TestDemo>{
    private String name;
    private int age;

    public TestDemo() {
    }

    public TestDemo(String name, int age) {
        this.name = name;
        this.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;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TestDemo testDemo = (TestDemo) o;
        return age == testDemo.age && Objects.equals(name, testDemo.name);
    }
//在這重寫hashCode方法,
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "TestDemo{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

   // 重新compareTo按照年齡排序
    /*
     this:要新增的資料
     o   :已經在紅黑樹存在的資料


        return:  負數:在紅黑樹的左邊
                 正數:在紅黑樹的右邊
                 0:已經在紅黑樹存在,捨棄
     */
    @Override
    public int compareTo(TestDemo o) {
        return this.getAge()-o.getAge();
    }
}

  



練習:
package com.Lucky;

import java.util.Comparator;
import java.util.TreeSet;

/*
    要求 :建立五個Student物件 ,有屬性:姓名/年齡/語文/數學/英語
          先按照總分從高到低排序
          總分一樣,就按照語文成績排序
          如果語文成績也一樣,就按照數學成績排序
          如果數學成績也一樣,就按照英語成績排序
          如果英語成績也一樣,就按照年齡排序
          如果年齡也一樣,就按照字母排序



 */
public class TreeSetDemoThree {
    public static void main(String[] args) {
        //建立集合
        //自定義比較器物件【如果自然排序和比較器同時存在,採用自定義比較器方法】
        TreeSet<Student> tree=new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int i=o1.getVerbal()+o1.getMath()+o1.getEnglish();
                int t=o2.getVerbal()+o2.getMath()+o2.getEnglish();
                int val=i-t;
                //比較語文成績
                val= val==0 ?o1.getVerbal()-o2.getVerbal():val;
                //比較數學成績
                val= val==0 ? o1.getMath()-o2.getMath():val;
                //比較英語成績
                val= val==0 ? o1.getEnglish()-o2.getEnglish():val;
                //比較年齡
                val= val==0 ? o1.getAge()-o2.getAge():val;
                //比較字母排序
                val= val==0 ? o1.getName().compareTo(o2.getName()):val;
                return val;
            }
        });

        //建立Student物件
        Student stud1=new Student("唯易",22,98,95,85);
        Student stud2=new Student("新風",21,80,65,85);
        Student stud3=new Student("張三",23,70,88,77);
        Student stud4=new Student("李四",27,98,60,66);
        Student stud5=new Student("王五",23,98,95,85);

        //往集合新增資料
        tree.add(stud1);
        tree.add(stud2);
        tree.add(stud3);
        tree.add(stud4);
        tree.add(stud5);

        for (Student student : tree) {
          int sum=  student.getMath()+student.getEnglish()+student.getVerbal();
            System.out.println(student+"總分是:"+sum);
        }

    }
}