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}] |