java基础之Arrays类和比较器

来源:互联网 发布:centos 安装openjdk 编辑:程序博客网 时间:2024/06/10 19:32

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接口

0 0
原创粉丝点击