正常来说 Arrays可以用于数组排序, 但如果数组里面是引用类型地址就会报错,这时候,
就需要加个功能(实现接口/继承接口) Comparable接口来定引用类型对象的排序规则(以..属性值进行排序)
正常Arrays.sort( 数组对象)进行排序时 , 会在排序的时候将数组对象进行调用comparato方法( Student o),两两冒泡比较
返回值1 : 告诉sort排序 左边大于右边,放后面,
返回值-1: 告诉sort排序 左边小于右边不用动
返回值0 : 告诉sort排序左边与右边相等,没事
1. 基本数据类型排序
Student[] students = new Student[4]; students[0] = new Student("蜘蛛精","169.5",23); students[1] = new Student("至尊宝","198.5",35); students[2] = new Student("紫霞精","162.5",16); students[3] = new Student("猪八戒","173.5",19); Arrays.sort(students); //原本用sort看student有没有排序规则,没有报错,//有的化,就按照指定规则排序( 排序谁,谁实现接口comparable的comparto方法自定义排序) System.out.println(Arrays.toString(students));//报错,不能对数组里的数组进行排序,不知道按照什么规则
2.以对象的属性进行排序
默认正向排序 ,若想反向排序 return -(this.age-o.age);
或 return (o.age - this.age)
package Arrays_sort_comparable; public class Student implements Comparable <Student> {
// 目的,对数组的Arrays.sort 的排序进行按照指定元素排序 ,实现comparable接口 private String name; private String height; private int age; public Student() { } public Student(String name, String height, int age) { this.name = name; this.height = height; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getHeight() { return height; } public void setHeight(String height) { this.height = height; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Student o) { //约定1 : 认为左边对象 大于右边对象 ,请返回正整数 //这里height是字符串,需要转成double类型 使用Double.valueof("字符串")
/* if (Double.valueOf(this.height )> Double.valueOf(o.height)){ return 1; //不换位置 }*/// return this.age - o.age; //升序 最简单if (this.age > o.age){ return 1; //不换位置 } //约定2 : 认为左边对象 小于右边对象 ,请返回负整数 else if (this.age < o.age){ return -1; //交换位置 } //约定3 : 认为左边对象 等于右边对象 ,请返回0 return 0;//保持不变,索引进入下一个 } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", height='" + height + '\'' + ", age=" + age + '}'; } }
3. 忽略大小写首字符排序
public static void main(String[] args) { String []names = {"body","anager", "Lambda","jack"}; // 对字符串进行排序,忽略首字符大小写进行排序 Arrays.sort(names, new Comparator<String>() { @Override public int compare(String o1, String o2) { // return o1.compareToIgnoreCase(o2); //忽略首字符大小写进行排序 } }); System.out.println(Arrays.toString(names)); }