1. 程式人生 > 其它 >集合框架(TreeSet排序--儲存字串---自定義物件)

集合框架(TreeSet排序--儲存字串---自定義物件)

TreeSet:能夠對元素按照某種規則進行排序。
* 排序有兩種方式
* A:自然排序
* B:比較器排序
*
* TreeSet集合的特點:排序和唯一
*
* 通過觀察TreeSet的add()方法,我們知道最終要看TreeMap的put()方法

 

A:自然排序

 1 public class TreeSetDemo {
 2     public static void main(String[] args) {
 3         // 建立集合物件
 4         // 自然順序進行排序
//無參構造--自然排序
5 TreeSet<Integer> ts = new
TreeSet<Integer>(); 6 7 // 建立元素並新增 8 // 20,18,23,22,17,24,19,18,24 9 ts.add(20); 10 ts.add(18); 11 ts.add(23); 12 ts.add(22); 13 ts.add(17); 14 ts.add(24); 15 ts.add(19); 16 ts.add(18); 17 ts.add(24); 18 19
// 遍歷 20 for (Integer i : ts) { 21 System.out.println(i); 22 } 23 } 24 }

 學生類----儲存自定義物件

package Day17;
//Comparable此介面強行對實現它的每個類的物件進行整體排序。這種排序被稱為類的自然排序,
// 類的 compareTo 方法被稱為它的自然比較方法。
public class Student1 implements Comparable<Student1> {
    private String name;
    
private int age; //構造 public Student1(){} public Student1(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; } //按照姓名的長度進行排序 //Comparable此介面強行對實現它的每個類的物件進行整體排序。這種排序被稱為類的自然排序, // 類的 compareTo 方法被稱為它的自然比較方法。
     //重寫介面的compareTo方法

public int compareTo(Student1 m){
//首先進行姓名長度的比較
        int num  = this.name.length()-m.name.length();
        //如果姓名長度相同再比較其姓名是否相同
        int num2 = num==0? this.name.compareTo(m.name):num;
        //姓名長度相同==名字相同==再不其年齡是否相同
        int num3 = num2==0?this.age-m.age:num2;

        return num3;
    }

}

 測試類---儲存自定義物件

package Day17;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.TreeSet;
//按照姓名的長度進行排序
public class Lx2 {
    public static void main(String[] args) {
        //建立TreeSet集合物件---給出泛型 =---無參構造自然排序
TreeSet<Student1> AA =new TreeSet<Student1>(); //建立學生類物件 Student1 A = new Student1("趙同剛哈哈",25); Student1 B = new Student1("王麗",25); System.out.println(A.compareTo(B)); Student1 C = new Student1("趙同剛哈哈",27); Student1 D = new Student1("王麗麗",25); Student1 E = new Student1("朱慶娜哈",24); Student1 F = new Student1("劉詩詩哈哈哈哈哈",25); Student1 G = new Student1("諸葛亮哈哈哈哈",28); //將學生類物件的資料新增到集合中 //新增時。add方法中就具有Comparable介面中的compareTo方法 //在學生類中進行對compareTo的重寫--制定輸出的標準 //此時的輸出標準是--姓名長度--姓名是否相同--年齡 AA.add(A); AA.add(B); AA.add(C); AA.add(D); AA.add(E); AA.add(F); AA.add(G); //遍歷輸出檢視 for(Student1 e : AA ){ System.out.println(e.getName()+"---"+e.getAge()); } } }

 

TreeSet比較器排序

學生類

public class Student1{
    private String name;
    private int age;

    //構造
    public Student1(){}

    public Student1(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;
    }

 

實現介面類 

學生類:

package cn.itcast_07;

public class Student {
    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        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;
    }
}

 

 實現類

 

package cn.itcast_07;

import java.util.Comparator;

public class MyComparator implements Comparator<Student> {

    @Override
    public int compare(Student s1, Student s2) {
        // int num = this.name.length() - s.name.length();
        // this -- s1
        // s -- s2
        // 姓名長度
        int num = s1.getName().length() - s2.getName().length();
        // 姓名內容
        int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
        // 年齡
        int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
        return num3;
    }

}

 

 

 

測試類

 

package cn.itcast_07;

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

/*
 * 需求:請按照姓名的長度排序
 * 
 * TreeSet集合保證元素排序和唯一性的原理
 * 唯一性:是根據比較的返回是否是0來決定。
 * 排序:
 *         A:自然排序(元素具備比較性)
 *             讓元素所屬的類實現自然排序介面 Comparable
 *         B:比較器排序(集合具備比較性)
 *             讓集合的構造方法接收一個比較器介面的子類物件 Comparator
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        // 建立集合物件
        // TreeSet<Student> ts = new TreeSet<Student>(); //自然排序
        // public TreeSet(Comparator comparator) //比較器排序
        // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());

        // 如果一個方法的引數是介面,那麼真正要的是介面的實現類的物件
        // 而匿名內部類就可以實現這個東西
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                // 姓名長度
                int num = s1.getName().length() - s2.getName().length();
                // 姓名內容
                int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
                        : num;
                // 年齡
                int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
                return num3;
            }
        });

        // 建立元素
        Student s1 = new Student("linqingxia", 27);
        Student s2 = new Student("zhangguorong", 29);
        Student s3 = new Student("wanglihong", 23);
        Student s4 = new Student("linqingxia", 27);
        Student s5 = new Student("liushishi", 22);
        Student s6 = new Student("wuqilong", 40);
        Student s7 = new Student("fengqingy", 22);
        Student s8 = new Student("linqingxia", 29);

        // 新增元素
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);
        ts.add(s7);
        ts.add(s8);

        // 遍歷
        for (Student s : ts) {
            System.out.println(s.getName() + "---" + s.getAge());
        }
    }
}