Java Comparator 排序
来源:互联网 发布:java三年工作经验工资 编辑:程序博客网 时间:2024/06/13 14:02
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。
一、Comparator
强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。
在java.util包中有一个Collections类,里面实现了对列表排序的功能,提供了一个静态方法sort方法,接收一个列表和一个Comparator接口的实例
实现的大致步骤如下:
1,先将元素整合为一个列表数组
2,通过Arrays的sort方法对数组排序,传入Comparator接口的实例
3,然后再把排好序的数组的数值设置到原来的列表对象中去
如果Comparator接口的compare方法返回一个小于0的数,表示被比较的两个对象中,前者小于后者
接口方法:
public class StepComparator implements Comparator<Step>{// 如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0; @Override public int compare(Step o1, Step o2) { if(...)return 1; else if(...)return -1; return 0; }} public class TestComparator { public static void main(String[] args) { List<Step> steplist=new ArrayList<Step>; StepComparator cp=new StepComparator(); Collections.sort(steplist,cp);}}
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; class UserModel { private String userName,userId; private int age; public String getUserName() { return userName; } public String getUserId() { return userId; } public int getAge() { return age; } public UserModel(String userName, String userId, int age) { this.userName = userName; this.userId = userId; this.age = age; } public String toString(){ return "userName="+userName+",userId="+userId+",age="+age; } } //直接使用Collections来排序 public class TestComparator { public static void main(String[] args) { // 准备要测试的数据 UserModel um1 = new UserModel("u1","user1",21); UserModel um2 = new UserModel("u2","user2",24); UserModel um3 = new UserModel("u3","user3",25); UserModel um4 = new UserModel("u4","user4",22); //添加到列表中 List<UserModel> list = new ArrayList<UserModel>(); list.add(um1); list.add(um2); list.add(um3); list.add(um4); System.out.println("排序前-------------"); printList(list); //用匿名类实现比较器,也可以单独用一个类来实现 Comparator cp = new Comparator(){ @Override public int compare(Object arg0, Object arg1) { //这里实现按照用户年龄大小来排序 UserModel temp1 = (UserModel) arg0; UserModel temp2 = (UserModel) arg1; if(temp1.getAge()>temp2.getAge())return 1; else if(temp1.getAge()<temp2.getAge())return -1; else if(temp1.getAge()==temp2.getAge())return 0; return 0; } }; //排序,主要就是依靠Comparator接口的具体实现 Collections.sort(list,cp); System.out.println("排序后-------------"); printList(list); } private static void printList(List<UserModel> list) { for(UserModel um:list){ System.out.println(um); } } }
排序前-------------
userName=u1,userId=user1,age=21
userName=u2,userId=user2,age=24
userName=u3,userId=user3,age=25
userName=u4,userId=user4,age=22
排序后-------------
userName=u1,userId=user1,age=21
userName=u4,userId=user4,age=22
userName=u2,userId=user2,age=24
userName=u3,userId=user3,age=25
comarable 暂时不说了。看http://www.blogjava.net/fastunit/archive/2008/04/08/191533.html
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码(比如这里的我们需要比较的是UserModel。实用comparable需要修改UserModel,但是comparaotr不需要), 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。所以我推荐comparator
0 0
- Java Comparator 排序
- Java Comparator排序
- java实现comparator排序
- Java中的排序 Comparator,Comparable
- java comparable 和 comparator 排序
- JAVA排序(二) Comparator接口
- Java:对象排序:Comparator&Comparable
- JAVA Comparator 接口排序用法
- Java Comparable Comparator 排序应用
- Java 排序Comparator的实践
- [java 排序] Comparable 和 Comparator
- java排序Comparator基本用法
- java 基础知识【Comparator排序小记】
- 【Java基础】Java排序之Comparator接口
- java对象排序-Comparator和Comparable
- JAVA 利用Comparator实现自定义排序
- java Comparable 和 Comparator 的 Collections 排序
- java多条件优先级排序 --------- Comparator
- 动力效果 UIGravityBehavior- UICollisionBehavior- UIDynamicItemBehavior
- POJ 1503 Integer Inquiry 美丽的大整数相加 + 测试数据
- 判断一个数组是否是一棵树的后续遍历
- 事务1
- android控件checkBox的选中效果
- Java Comparator 排序
- 【解决方法】Setup script exited with error: command 'cc' failed with exit status 1
- HTTP协议详解(真的很经典)
- HTML学习记录<一>:<abbr>及<acronym>
- matlab中sum函数对矩阵的求和总结
- C# Task类 笔记
- Linux守护进程设计规范及python实现http://blog.csdn.net/dysj4099/article/details/18219411
- 黑马程序员——面向对象之异常(二)
- Java 调用dll