java内部封装了快速排序,用起来非常方便,然后我想用这个排序对类中的某一个字段进行排序,例如根据年龄排序,这样普通的办法就没法实现,然后这个时候需要实现java的比较器Comparator,然后重写其中的方法compare,比较部分的逻辑。下面看代码:
package javaProject;
import java.util.Comparator;
public class myComprator implements Comparator<StuVo>{
@Override
public int compare(StuVo o1, StuVo o2){
double a1=Double.valueOf(o1.getAge());
double a2=Double.valueOf(o2.getAge());
return (int) (a1-a2);
}
}
Stuvo.java的代码:
package javaProject;
public class StuVo {
private String id;
private String name;
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public StuVo(String id, String name, String age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public StuVo() {
super();
}
}
这就是一个简单的实体类,我要根据年龄排序,所以比较器里面就是对年龄进行减法,如果前面的大于后面的返回的数就大于0,相等就等于0,小于就小于0,然后再下面进行调用就实现了对年龄的排序 调用的时候只要1行代码 Collections.sort(list, new myComprator());
package javaProject;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javaProject.TestComparator.AsComparator;
/**
* 比较器的一个示例
* @author 李冉
*
*/
public class SortExample {
public static void main(String[] args) {
List<StuVo> list=new ArrayList<StuVo>();
StuVo stu1=new StuVo("1", "aaa", "15.000001");
list.add(stu1);
StuVo stu2=new StuVo("2", "bbb", "10");
list.add(stu2);
StuVo stu3=new StuVo("3", "ccc", "16");
list.add(stu3);
StuVo stu4=new StuVo("4", "ddd", "15.00000000000000002");
list.add(stu4);
StuVo stu5=new StuVo("5", "eee", "1");
list.add(stu5);
list.toArray().toString();
for(StuVo s:list){
System.out.println(" stuvo : id "+s.getId()+" name "+s.getName()+" age is "+s.getAge());
}
//list.set(0, stu2);
//list.set(1, stu1);
Collections.sort(list, new myComprator());
System.out.println("------------------------------");
for(StuVo s:list){
System.out.println(" stuvo : id "+s.getId()+" name "+s.getName()+" age is "+s.getAge());
}
}
// public class myComprator implements Comparator<StuVo>{
//
// @Override
// public int compare(StuVo o1, StuVo o2){
//
// double a1=Double.valueOf(o1.getAge());
// double a2=Double.valueOf(o2.getAge());
//
//
//
//
// return (int) (a1-a2);
//
// }
//
}
上面是执行部分的代码
结果:
stuvo : id 1 name aaa age is 15
stuvo : id 2 name bbb age is 10
stuvo : id 3 name ccc age is 16
stuvo : id 4 name ddd age is 15
stuvo : id 5 name eee age is 1
------------------------------
stuvo : id 5 name eee age is 1
stuvo : id 2 name bbb age is 10
stuvo : id 1 name aaa age is 15
stuvo : id 4 name ddd age is 15
stuvo : id 3 name ccc age is 16
但是,有一个问题
当小数点过多的时候结果就会错误,例如:
stuvo : id 1 name aaa age is 15.000001
stuvo : id 2 name bbb age is 10
stuvo : id 3 name ccc age is 16
stuvo : id 4 name ddd age is 15.00000000000000002
stuvo : id 5 name eee age is 1
------------------------------
stuvo : id 5 name eee age is 1
stuvo : id 2 name bbb age is 10
stuvo : id 1 name aaa age is 15.000001
stuvo : id 4 name ddd age is 15.00000000000000002
stuvo : id 3 name ccc age is 16
我的解决办法就是在比较器中给这些数字都乘上一个很大的数,就是扩大相同倍数,把小数点都去掉,这样就OK了。