java基礎之Arrays類和比較器

Arrays類是一個對數組進行操作的類,我們常使用的方法有Arrays.sort();進行升序排序,Arrays.toString(arr);用於返回指定數組的字符串表示形式


範例:

public class Demo1 {
    public static void main(String[] args) {
        int[] arr = {8,7,9,0,10,88,99,11,55,66,22,1,2};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

結果:

[0, 1, 2, 7, 8, 9, 10, 11, 22, 55, 66, 88, 99]

但是我們查看api在Arrays類中有一個這樣的Sort方法

這裏寫圖片描述

可以對一個對象數組進行排序,那麼我們進來對對象數組進行排序


範例:

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 void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    //Overide toString() to convenient to output
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}
public class Demo1 {
    public static void main(String[] args) {
        Person[] person = {
            new Person("Lar",23),
            new Person("mike",25),
            new Person("jerry",18),
            new Person("trico",16)
        };
        Arrays.sort(person);
        for (int i = 0; i < person.length; i++) {
            System.out.println(person[i]);
        }
    }
}

結果:

這裏寫圖片描述

此時提示的是一個類轉換異常:Person類不能向Comparable轉換。


當需要對一組對象進行排序的時候,一定要指定比較規則,這種比較規則主要是將某一個類的某個屬性。這就需要java中的比較器進行實現。

對於比較器的實現java中有兩種接口完成:

Comparable
Comparator

我們這裏只介紹使用廣泛的Comparable接口。

首先來看下接口的定義:

public interface Comparable<T>{
    public int compareTo(T o) ;
}

Comparable接口中只存在一個方法,此方法是爲了編寫比較規則的,方法的返回值是一個int類型,此值只會返回三個結果(等於0,小於0,大於0)。


要想實現對象數組的排序,我們就要實現Comparable接口

範例:

class Person implements Comparable<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 void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    //Overide toString() to convenient to output
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    //wirte rules
    @Override
    public int compareTo(Person o) {
        int num = this.age - o.age;
        if(num==0)
            return this.name.compareTo(o.name);
        return num;
    }

}
public class Demo1 {
    public static void main(String[] args) {
        Person[] person = {
            new Person("Lar",23),
            new Person("mike",25),
            new Person("jerry",18),
            new Person("trico",16),
            new Person("marry",16)
        };
        Arrays.sort(person);
        for (int i = 0; i < person.length; i++) {
            System.out.println(person[i]);
        }
    }
}

以上方法comparableTo方法的比較規則是,大條件先按照年齡排序,小條件再按照姓名排序

結果:

Person [name=marry, age=16]
Person [name=trico, age=16]
Person [name=jerry, age=18]
Person [name=Lar, age=23]
Person [name=mike, age=25]

總結:

如果對象數組要排序,那麼對象所在的類必須實現Comparable接口

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