Arrays.sort()支持所有基本数据类型的排序(byte,char,short,int,float,double,long)、Object对象排序及自定义的对象排序(需要实现Comparable接口或传入一个Comparator比较器,下面将会讲解)。
对于元素类型是基本数据类型的数组,排序很简单,只需将数组传给Arrays.sort()即可。
package sort;
import java.util.Arrays;
public class JavaSort { public static void main(String[] args) { int[] x={5,2,10,45,6,4,69}; System.out.println("排序前......"); System.out.println(Arrays.toString(x)); Arrays.sort(x);//排序,默认是从小到大 System.out.println("排序后......"); System.out.println(Arrays.toString(x)); } }
运行结果 排序前...... [5, 2, 10, 45, 6, 4, 69] 排序后...... [2, 4, 5, 6, 10, 45, 69]
对象排序,则必须告诉JVM排序规则。
如果你留意过Integer,Double,Long,String等这些类,会发现他们都实现了Comparable接口,Comparable接口定义如下
public interface Comparable<T> { public int compareTo(T o); }
Integer类中的compareTo()方法
public int compareTo(Integer anotherInteger) { int thisVal = this.value; int anotherVal = anotherInteger.value; return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1)); }
两对象比较,前者<后者,返回-1;前者>后者,返回1;前者=后者,返回0.
下面写个小例子看下,两个user比较,按照age排序,如果age相等就按照姓名(中文)的拼音顺序排序。由于这例子中涉及到中文按拼音顺序排序。所以先看个中文排序例子。
中文按照拼音顺序排序。
package sort;
import java.text.Collator; import java.util.Arrays;
public class JavaSort { public static void main(String[] args) { Collator cmp=Collator.getInstance(java.util.Locale.CHINA);//获得中文比较器 String[] x={"张三","李四","赵五","孙六"}; System.out.println("排序前......"); System.out.println(Arrays.toString(x)); Arrays.sort(x,cmp);//告诉Arrays.sort要按照cmp这个比较规则进行比较 System.out.println("排序后......"); System.out.println(Arrays.toString(x));
} }
运行结果
排序前...... [张三, 李四, 赵五, 孙六] 排序后...... [李四, 孙六, 张三, 赵五]
好了,已经知道中文按照拼音顺序排序的方法了,那么下面来看看user按照age排序,如果age相等,就按照name(中文)排序的小例子.
package sort;
import java.text.Collator; import java.util.Locale;
public class User implements Comparable<User>{
private String name; private int age;
public User(String name,int age){ this.name=name; this.age=age; }
@Override public int compareTo(User o) { int c1=this.age<o.getAge()?-1:(this.age==o.getAge()?0:1);//age compare if(c1!=0) return c1;//如果年龄不相等,则返回比较结果,姓名就不需要比较了 return Collator.getInstance(Locale.CHINA).compare(this.name, o.getName());//返回姓名比较的结果 }
/** * 为了方便打印user对象,重写toString */ public String toString(){ return "{"+this.name+" "+this.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; }
}
package sort;
import java.text.Collator; import java.util.Arrays;
public class JavaSort { public static void main(String[] args) { User[] users={ new User("张三",20), new User("李四",25), new User("赵五",18), new User("孙六",18) }; System.out.println("排序前......"); System.out.println(Arrays.toString(users)); Arrays.sort(users); System.out.println("排序后......"); System.out.println(Arrays.toString(users));
} }
运行结果
排序前...... [{张三 20}, {李四 25}, {赵五 18}, {孙六 18}] 排序后...... [{孙六 18}, {赵五 18}, {张三 20}, {李四 25}]
上面的user类直接实现了Comparable接口,所以user对象可以进行比较。但是我们开发中,可能会遇到这种情况,比如User类是一个
JavaBean(POJO),初期是没有实现Comparable接口的,现在有需求需要user对象可以进行比较排序,先按照age排序,再按照name排序,不允许对User类进行修改。为了解决这种情况,JAVA提供了Comparator接口,定义如下
public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }
如果你细心,就会发现我上面贴出的Arrays.sort()重载的截图,发现有个sort(T[] a, Comparator<? super T> c);这个方法就是允许你传入一个自己定义的比较器。
package sort;
public class User {
private String name; private int age;
public User(String name,int age){ this.name=name; this.age=age; }
/** * 为了方便打印user对象,重写toString */ public String toString(){ return "{"+this.name+" "+this.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; }
}
package sort;
import java.text.Collator; import java.util.Comparator; import java.util.Locale;
public class UserComparator implements Comparator<User>{
@Override public int compare(User u1, User u2) { int c1=u1.getAge()<u2.getAge()?-1:(u1.getAge()==u2.getAge()?0:1);//年龄比较 if(c1!=0) return c1; return Collator.getInstance(Locale.CHINA).compare(u1.getName(), u2.getName());//返回姓名比较的结果 }
}
package sort;
import java.text.Collator; import java.util.Arrays;
public class JavaSort { public static void main(String[] args) { User[] users={ new User("张三",20), new User("李四",25), new User("赵五",18), new User("孙六",18) }; System.out.println("排序前......"); System.out.println(Arrays.toString(users)); Arrays.sort(users,new UserComparator());//这里的比较器也可以写成匿名类,不需要在写一个UserComparator类了 System.out.println("排序后......"); System.out.println(Arrays.toString(users));
} }
运行结果 排序前...... [{张三 20}, {李四 25}, {赵五 18}, {孙六 18}] 排序后...... [{孙六 18}, {赵五 18}, {张三 20}, {李四 25}]
|