java 根据对象中的某一项进行排序
2015-07-18 20:17
471 查看
java内部封装了快速排序,用起来非常方便,然后我想用这个排序对类中的某一个字段进行排序,例如根据年龄排序,这样普通的办法就没法实现,然后这个时候需要实现java的比较器Comparator,然后重写其中的方法compare,比较部分的逻辑。下面看代码:
Stuvo.java的代码:
这就是一个简单的实体类,我要根据年龄排序,所以比较器里面就是对年龄进行减法,如果前面的大于后面的返回的数就大于0,相等就等于0,小于就小于0,然后再下面进行调用就实现了对年龄的排序 调用的时候只要1行代码 Collections.sort(list, new myComprator());
上面是执行部分的代码
结果:
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了。
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了。
相关文章推荐
- 解决ubuntu中JDK的Picked up JAVA_TOOL_OPTIONS提示问题。
- href="#"和javasrcript:void(0)的区别
- Java并发编程:Callable、Future和FutureTask
- java线程同步
- eclipse的.properties文件中文显示问题
- Java学习之路0718(五)
- java里的这些
- Java_Web _Servlet生命周期实验
- Spring的JDBC(非web程序)的简单例子
- java学习路线
- java线程协作
- JAVA实现快速排序
- JDK安装及配置
- java面向对象(多态)
- 初识JAVA1
- Java IO: InputStream
- Java学习笔记之<JDBC连接MySQL的步骤>
- java面向对象(接口)
- java面向对象(抽象类)
- 2015第29周六Spring