我们经常需要对列表或者数组进行排序,如果每次都自己写算法实现是很麻烦的,也是没必要的,Java本身自带了一个排序方法,可以对指定的列表或数组进行排序,而我们所要做的就是,编写排序规则.
实现 比较接口(排序规则)
java.util.Comparator<T>
int | compare (T o1, T o2) |
Compares its two arguments for order. |
例如下面的类和排序规则:
package test.Java;
import java.util.Comparator;
/**
* Member 类
* @author Ren.xia
*
*/
class Member {
int nID = 0;
int nAge = 0;
public Member(int nID, int nAge) {
// TODO Auto-generated constructor stub
this.nID = nID;
this.nAge = nAge;
}
}
/**
* 对Member排序的规则类
* 对ID上升排序
* @author Ren.xia
*
*/
class SortByID implements Comparator<Member> {
//排序
public int compare(Member o1, Member o2) {
return (o1.nID - o2.nID);
}
}
/**
* 对Member排序的规则类
* 对Age上升排序
* @author Ren.xia
*
*/
class SortByAge implements Comparator<Member> {
//排序
public int compare(Member o1, Member o2) {
return (o1.nAge - o2.nAge);
}
}
对列表进行排序
java.lang.Object java.util.Collections
static <T extends Comparable <? super T>> void | 根据指定比较器产生的顺序对指定对象数组进行排序。 |
static <T> void | sort (List <T> list, Comparator <? super T> c) 根据指定比较器产生的顺序对指定对象数组进行排序。 |
package test.Java;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
public class JavaTest {
public static void main(String[] args) {
List<Member> memberList = new ArrayList<Member>();
memberList.add(new Member(0, 23));
memberList.add(new Member(1, 27));
memberList.add(new Member(2, 24));
memberList.add(new Member(3, 22));
//对列表 进行年龄升序排序并输出
java.util.Collections.sort(memberList, new SortByAge());
for (int i = 0; i < memberList.size(); i++) {
System.out.printf("No.%d : (ID:%d, Age:%d)\n", i, memberList.get(i).nID, memberList.get(i).nAge);
}
//对列表 进行ID升序排序并输出
java.util.Collections.sort(memberList, new SortByID());
for (int i = 0; i < memberList.size(); i++) {
System.out.printf("No.%d : (ID:%d, Age:%d)\n", i, memberList.get(i).nID, memberList.get(i).nAge);
}
}//end of func
}
输出结果:
No.0 : (ID:3, Age:22)
No.1 : (ID:0, Age:23)
No.2 : (ID:2, Age:24)
No.3 : (ID:1, Age:27)
No.0 : (ID:0, Age:23)
No.1 : (ID:1, Age:27)
No.2 : (ID:2, Age:24)
No.3 : (ID:3, Age:22)
对数组进行排序
java.lang.Object java.util.Arrays
static void |
sort (T[] a)
根据指定比较器产生的顺序对指定对象数组进行排序
static <T> void
sort (T[]a, Comparator <? super T> c)
根据指定比较器产生的顺序对指定对象数组进行排序
package test.Java;
import java.util.Comparator;
public class JavaTest {
public static void main(String[] args) {
Member[] members = {new Member(0, 29),
new Member(1, 23),
new Member(2, 22),
new Member(3, 25)};
//对数组 进行 年龄排序 输出
java.util.Arrays.sort(members, new SortByAge());
for (int i = 0; i < members.length; i++) {
System.out.printf("No.%d : (ID:%d, Age:%d)\n", i, members[i].nID, members[i].nAge);
}
//对数组 进行 ID排序 输出
java.util.Arrays.sort(members, new SortByID());
for (int i = 0; i < members.length; i++) {
System.out.printf("No.%d : (ID:%d, Age:%d)\n", i, members[i].nID, members[i].nAge);
}
}//end of func
}
输出结果 :
No.0 : (ID:2, Age:22)
No.1 : (ID:1, Age:23)
No.2 : (ID:3, Age:25)
No.3 : (ID:0, Age:29)
No.0 : (ID:0, Age:29)
No.1 : (ID:1, Age:23)
No.2 : (ID:2, Age:22)
No.3 : (ID:3, Age:25)
对于上面两个不论是列表排序还是数组排序都有一个方法sort(T[] a) 或 sort(List<T> list)
单参数都没有指定排序规则,因此这两个方法都必须使用另一个接口实现,否则会出现异常
java.lang.Comparable<T>
int |
比较此对象与指定对象的顺序。
这一套接口必须要在排序的类中实现
/**
* Member 类
* @author Ren.xia
*
*/
class Member implements Comparable<Member> {
int nID = 0;
int nAge = 0;
public Member(int nID, int nAge) {
// TODO Auto-generated constructor stub
this.nID = nID;
this.nAge = nAge;
}
public int compareTo(Member other) {
return (this.nID - other.nID);
}
}
排序时就可以这样使用
java.util.Arrays.sort(members);
//或
java.util.Collections.sort(memberList);
其结果是相同的,但是个人感觉不太灵活