数组对象的Arrays排序两种方式

例如一个学生对象,初始化了10个Student对象,Student对象有name和sno两个属性,在数组里存放了10个Student对象,但是他们的排序是无序的,我想在数组内按照sno去排序。Arrays提供了sort方法,这个是按照compareble接口方法实现。
我们这样定义Student类:

  • 第一种方法
class Student implements Comparable<Student>
{
    private int sno;
    private String name;
    @Override
    public int compareTo(Student o) {
        // TODO Auto-generated method stub
        if(this.sno > o.getSno()) return 1;
        else if(this.sno == o.getSno()) return 0;
        else return -1;
    }
    public int getSno() {
        return sno;
    }
    public void setSno(int sno) {
        this.sno = sno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "学生的学号为:"+sno+"  学生的名字为:"+name;
    }
}

随机生成的Student数组,去排序处理,重写toString方法可以在打印的时候得到想要的形式:

Student[] s = new Student[10];
        for(int i = 0;i < s.length;i ++)
        {
            Student student = new Student();
            int temp = (int)(Math.random() * 100);
            student.setSno(temp);
            student.setName("micro"+temp);
            s[i] = student;;
        }
        Arrays.sort(s);
        for(Student s2 : s)
        {
            System.out.println(s2);
        }

运行结果:

学生的学号为:7  学生的名字为:micro7
学生的学号为:8  学生的名字为:micro8
学生的学号为:13  学生的名字为:micro13
学生的学号为:20  学生的名字为:micro20
学生的学号为:43  学生的名字为:micro43
学生的学号为:58  学生的名字为:micro58
学生的学号为:65  学生的名字为:micro65
学生的学号为:72  学生的名字为:micro72
学生的学号为:75  学生的名字为:micro75
学生的学号为:99  学生的名字为:micro99
  • 第二个方法,定义比较器

但是这个方法有一定局限性,只能对一个属性进行排序,还有一种方式可以更加灵活排序,Arrays.sort(ArrayName,Comparetor)。
例如我们重新定义Student,增加了money属性,我们用一种方式可以很灵活的选择sno或则money去对Student排序:

//方法一,实现Compareble接口去排序,但是只能按照一种方式去排序,有一定局限性
class Student implements Comparable<Student>
{
    private int sno;
    private String name;
    private int money;
    @Override
    public int compareTo(Student o) {
        // TODO Auto-generated method stub
        if(this.sno > o.getSno()) return 1;
        else if(this.sno == o.getSno()) return 0;
        else return -1;
    }
    public int getSno() {
        return sno;
    }
    public void setSno(int sno) {
        this.sno = sno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "学生的学号为:"+sno+"  学生的名字为:"+name+" money:"+money;
    }
    public int getMoney() {
        return money;
    }
    public void setMoney(int money) {
        this.money = money;
    }
    }

定义两个分别比较sno和money的比较器:

class CompareBySno implements Comparator<Student>
{

    @Override
    public int compare(Student o1, Student o2) {
        // TODO Auto-generated method stub
        if(o1.getSno() > o2.getSno()) return 1;
        else if(o1.getSno() < o2.getSno()) return -1;
        else return 0;
    }
    }
//第二种排序方式
class CompareByMoney implements Comparator<Student>
{

    @Override
    public int compare(Student o1, Student o2) {
        // TODO Auto-generated method stub
        return o1.getMoney() - o2.getMoney();
    }
    }

返回的值大于等于或则小于零来排序。

我们来测试:
随机生成的学生里也随机生成moeny值:

Student[] s = new Student[10];
        for(int i = 0;i < s.length;i ++)
        {
            Student student = new Student();
            int temp = (int)(Math.random() * 100);
            student.setSno(temp);
            student.setName("micro"+temp);
            student.setMoney((int)(Math.random() * 100));
            s[i] = student;;
        }

初始化两个比较器:

CompareBySno compareBySno = new CompareBySno();
        CompareByMoney compareByMoney = new CompareByMoney();

通过钱去排序:

        Arrays.sort(s,compareByMoney);
        for(Student s2 : s)
        {
            System.out.println(s2);
        }

运行结果:

学生的学号为:79  学生的名字为:micro79 money:3
学生的学号为:15  学生的名字为:micro15 money:10
学生的学号为:20  学生的名字为:micro20 money:15
学生的学号为:64  学生的名字为:micro64 money:23
学生的学号为:82  学生的名字为:micro82 money:32
学生的学号为:81  学生的名字为:micro81 money:38
学生的学号为:5  学生的名字为:micro5 money:66
学生的学号为:14  学生的名字为:micro14 money:86
学生的学号为:73  学生的名字为:micro73 money:88
学生的学号为:23  学生的名字为:micro23 money:94

按照sno去排序:

        Arrays.sort(s,compareBySno);
        for(Student s2 : s)
        {
            System.out.println(s2);
        }
学生的学号为:4  学生的名字为:micro4 money:25
学生的学号为:26  学生的名字为:micro26 money:76
学生的学号为:36  学生的名字为:micro36 money:42
学生的学号为:38  学生的名字为:micro38 money:83
学生的学号为:46  学生的名字为:micro46 money:52
学生的学号为:63  学生的名字为:micro63 money:65
学生的学号为:71  学生的名字为:micro71 money:68
学生的学号为:76  学生的名字为:micro76 money:84
学生的学号为:87  学生的名字为:micro87 money:12
学生的学号为:88  学生的名字为:micro88 money:78

完成两种排序方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值