Java Comparator 排序

当需要排序的集合或数组不是单纯的数字型时,通常可以使用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

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值