例如一个学生对象,初始化了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
完成两种排序方式。