Java集合的排序
时间:2010-08-30 来源:qdl2010
Java集合或数组的排序有两种方式,使用自定义的比较器以及内部元素实现Comparable接口:
一.使用自定义的比较器
1. person类:
package com.qdl.test;
public class Person {
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = 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;
}
}
2. 自定义的比较器: package com.qdl.test; import java.util.Comparator; public class MyComparator implements Comparator<Person> { //定义一些排序规则 public int compare(Person p1, Person p2) {
if(p1.getAge()<p2.getAge()){
return -1; //返回负整数
}else if(p1.getAge()==p2.getAge()){
return 0; //返回0
}else{
return 1; //返回正整数
}
} }
3. 测试程序: package com.qdl.test; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class Test { public static void main(String[] args) {
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("aaa",25));
persons.add(new Person("bbb",18));
persons.add(new Person("ccc",20));
persons.add(new Person("ddd",45));
MyComparator comparator = new MyComparator();
// 数组的话使用:Arrays.sort(T[] a, Comparator<? extends T>);
Collections.sort(persons,comparator);
for(Person p:persons){
System.out.println(p.getName()+"-->"+p.getAge());
}
}
}
输出结果为(按年龄升序) bbb-->18
ccc-->20
aaa-->25
ddd-->45 二.内部元素实现Comparable接口的方式 1. 把Person类修改一下,让它实现Comparable接口: package com.qdl.test; public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = 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;
}
public int compareTo(Person p) {
//实现接口中的方法,定义排序规则
if(this.age<p.age){
return -1; //返回负整数
}else if(this.age>p.age){
return 1; //返回正整数
}else{
return 0; //返回0
}
}
}
2. 测试程序 package com.qdl.test; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class Test { public static void main(String[] args) {
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("aaa",25));
persons.add(new Person("bbb",18));
persons.add(new Person("ccc",20));
persons.add(new Person("ddd",45));
//由于Person类实现了Comparable接口,所以使用Collections的sort()方法就能实现自动排序
//若是数组的话使用Arrays.sort(persons);
Collections.sort(persons);
for(Person p:persons){
System.out.println(p.getName()+"-->"+p.getAge());
}
}
}
输出结果为(按年龄升序) bbb-->18
ccc-->20
aaa-->25
ddd-->45 可以看到两种方式都能达到排序目的,实现Comparable接口将比较代码嵌入自身类中,而自定义的比较器(Comparator)在一个独立的类中实现比较,如果设计类时没有考虑到compare的问题而没有实现Comparable接口,那么可以使用自定义的Comparator来实现排序,并且可以为了不同的排序标准做准备,如升序、降序等等。
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = 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;
}
}
2. 自定义的比较器: package com.qdl.test; import java.util.Comparator; public class MyComparator implements Comparator<Person> { //定义一些排序规则 public int compare(Person p1, Person p2) {
if(p1.getAge()<p2.getAge()){
return -1; //返回负整数
}else if(p1.getAge()==p2.getAge()){
return 0; //返回0
}else{
return 1; //返回正整数
}
} }
3. 测试程序: package com.qdl.test; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class Test { public static void main(String[] args) {
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("aaa",25));
persons.add(new Person("bbb",18));
persons.add(new Person("ccc",20));
persons.add(new Person("ddd",45));
MyComparator comparator = new MyComparator();
// 数组的话使用:Arrays.sort(T[] a, Comparator<? extends T>);
Collections.sort(persons,comparator);
for(Person p:persons){
System.out.println(p.getName()+"-->"+p.getAge());
}
}
}
输出结果为(按年龄升序) bbb-->18
ccc-->20
aaa-->25
ddd-->45 二.内部元素实现Comparable接口的方式 1. 把Person类修改一下,让它实现Comparable接口: package com.qdl.test; public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = 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;
}
public int compareTo(Person p) {
//实现接口中的方法,定义排序规则
if(this.age<p.age){
return -1; //返回负整数
}else if(this.age>p.age){
return 1; //返回正整数
}else{
return 0; //返回0
}
}
}
2. 测试程序 package com.qdl.test; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class Test { public static void main(String[] args) {
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("aaa",25));
persons.add(new Person("bbb",18));
persons.add(new Person("ccc",20));
persons.add(new Person("ddd",45));
//由于Person类实现了Comparable接口,所以使用Collections的sort()方法就能实现自动排序
//若是数组的话使用Arrays.sort(persons);
Collections.sort(persons);
for(Person p:persons){
System.out.println(p.getName()+"-->"+p.getAge());
}
}
}
输出结果为(按年龄升序) bbb-->18
ccc-->20
aaa-->25
ddd-->45 可以看到两种方式都能达到排序目的,实现Comparable接口将比较代码嵌入自身类中,而自定义的比较器(Comparator)在一个独立的类中实现比较,如果设计类时没有考虑到compare的问题而没有实现Comparable接口,那么可以使用自定义的Comparator来实现排序,并且可以为了不同的排序标准做准备,如升序、降序等等。
相关阅读 更多 +