TreeSet排序--兩種實現方式

兩種方式,下面給出示例

在這裏插入圖片描述報錯原因分析:
由於不知道該按哪一種排序,所以會報錯。

解決方法:
1、自然排序。
2、比較器排序。

TreeSet類
TreeSet是SortedSet接口的唯一實現類,TreeSet可以確保集合元素處於排序狀態。TreeSet支持兩種排序方式,自然排序 和定製排序,其中自然排序爲默認的排序方式。向TreeSet中加入的應該是同一個類的對象。
TreeSet判斷兩個對象不相等的方式是兩個對象通過equals方法返回false,或者通過CompareTo方法比較沒有返回0

Person.java 和 Demo6.java
代碼如下:

第一種:自然排序___Person類實現接口Comparable

在自定義的Person類中,實現Comparable接口,重寫裏面的public int compareTo(Person p); 就會按照你重寫的這個方法的規則進行排序;

Person.java

package bean;

import java.util.Objects;

/**
 * @author wangtengfei
 * @ClassName Person
 * @date 2019/7/3 10:21
 */
public class Person implements Comparable<Person>{ //實現Comparable接口
    private String name;
    private int age;

    public Person() {
    }

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

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

    //重寫了equals()方法和hashcode()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    //public int compareTo(Person p)方法
    @Override
    public int compareTo(Person p) {
        if(p.getName().equals(this.name)){
            return 0;
        }
        int i=p.getAge()-this.age;
        return  i;

        //或者使用三元運算符更簡潔。
      //  return p.getName().equals(this.name) ? 0 : p.getAge()-this.age;
    }
}

Demo06.java

package Demo;

import bean.Person;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
/**
 * @author wangtengfei
 * @date 2019/7/3 14:09
 */
public class Demo6 {
    public static void main(String[] args) {
        Set<Person> set =new TreeSet<>();
        set.add(new Person("Kobe",45));
        set.add(new Person("James",20));
        set.add(new Person("Davies",37));
        set.add(new Person("盧本偉",25));

        for (Person person : set) {
            System.out.println(person);
        }
    }
}

運行結果:
在這裏插入圖片描述

第二種:比較器排序___通過TreeSet的構造方法傳入一個匿名內部類的比較器給TreeSet

Person.java

package bean;
import java.util.Objects;
/**
 * @author wangtengfei
 * @ClassName Person
 * @date 2019/7/3 10:21
 */
public class Person{
    private String name;
    private int age;

    public Person() {
    }

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

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

    //重寫了equals()方法和hashcode()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    

Demo06.java

package Demo;

import bean.Person;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
/**
 * @author wangtengfei
 * @date 2019/7/3 14:09
 */
public class Demo6 {
    public static void main(String[] args) {//實現一個匿名內部類
        Set<Person> set =new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getName().equals(o2.getName()) ? 0 : o1.getAge()-o2.getAge();
            }
        });
        set.add(new Person("Kobe",45));
        set.add(new Person("James",20));
        set.add(new Person("Davies",37));
        set.add(new Person("盧本偉",25));

        for (Person person : set) {
            System.out.println(person);
        }
    }
}

運行結果:
在這裏插入圖片描述

總結:

  1. TreeSet 是二差樹實現的,Treeset中的數據是自動排好序的,不允許放入null值。
  2. TreeSet支持兩種排序方式,自然排序 和定製排序,其中自然排序爲默認的排序方式。

希望能幫到你!!!望採納!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章