Java List排序实践

  1. 用Collections.sort方法对list排序有两种方法,本文只介绍其中之一。

list中的对象实现Comparable接口,具体操作很简单,只是人们容易忽略而已,在这里详细的介绍一下哈。

(1)创建一个UserDto实体类,并实现Comparable接口,并且重写其中的compareTo方法,如下所示:

public class UserDto implements Comparable{
    private Integer userId;

    private String userName;

    private Integer userAge;

    private boolean userSex;

    private String userAddress;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getUserAge() {
        return userAge;
    }

    public void setUserAge(Integer userAge) {
        this.userAge = userAge;
    }

    public boolean isUserSex() {
        return userSex;
    }

    public void setUserSex(boolean userSex) {
        this.userSex = userSex;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public int compareTo(Object o) {
        UserDto s = (UserDto)o;
        if(this.getUserName().compareTo(s.getUserName())==0){
            return 0;
        }else{
            if(this.getUserName().compareTo(s.getUserName())>0){
                return 1;
            }else{
                return -1;
            }
        }
    }
}
如果想改变字符串排序方式的话,可以修改compareTo方法的前后顺序,以上compareTo方法是对英文字符串比较排序的(非中文字符串,中文字符串下面有介绍),如果想对数值进行排序的话,可以用下面部分替换掉compareTo方法,如下所示:

//        if(o instanceof UserDto){
//            UserDto s=(UserDto)o;
//            if(this.getUserId()>s.getUserId()){
//                return 0;
//            }else{
//                if(this.getUserId()<s.getUserId()){
//                    return 1;
//                }else{
//                    return -1;
//                }
//            }
其实对于以上compareTo方法中还可以使用更为简单的方式,如下:

//return this.getUserName().compareTo(((UserDto)o).getUserName());
//return ((UserDto)o).getUserName().compareTo(this.getUserName());
根据在compareTo方法中直接返回以上语句就可以了,并且以上两句可以切换排序顺序--升序、降序。

(2)在测试main方法中只需要Collections.sort(userList)即可,具体操作如下:

List<UserDto> userList = new ArrayList<UserDto>();
UserDto userDto = new UserDto();
userDto.setUserId(1);
userDto.setUserName("zhangsan");

UserDto userDto1 = new UserDto();
userDto1.setUserId(1);
userDto1.setUserName("lisi");

UserDto userDto2 = new UserDto();
userDto2.setUserId(3);
userDto2.setUserName("wangwu");

UserDto userDto3 = new UserDto();
userDto3.setUserId(5);
userDto3.setUserName("maliu");

UserDto userDto4 = new UserDto();
userDto4.setUserId(5);
userDto4.setUserName("zhaoqi");

userList.add(userDto);
userList.add(userDto1);
userList.add(userDto2);
userList.add(userDto3);
userList.add(userDto4);
Collections.sort(userList);

for(UserDto userd:userList){
    System.out.println("编号:"+userd.getUserId()+";姓名:"+userd.getUserName());
}
(2)以上都是英文字符串,如果想对英文字符串进行排序的话,使用如下方法:

//        List<String> list = new ArrayList<String>();
//        list.add("张三");
//        list.add("李四");
//        list.add("王五");
//        list.add("马六");
//        list.add("赵七");
//        Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);//括号里面可有可无
//        Collections.sort(list,cmp);
//        for(String str:list){
//            System.out.println(str);
//        }

其中主要是Comparator cmp = Collator.getInstance(java.util.Locale.CHINA)不做过多介绍,不明白的,可以查一下。


3.如果某个实体已经写好了,没有必要对该实体实现Comparable类,也没有必要在重写compareTo方法了。直接在某个类内,创建内部类实现Comparator,并重写compare方法即可。

  1.     // 自定义比较器:按书的价格排序  
  2.     static class PriceComparator implements Comparator {  
  3.         public int compare(Object object1, Object object2) {// 实现接口中的方法  
  4.             Book p1 = (Book) object1; // 强制转换  
  5.             Book p2 = (Book) object2;  
  6.             return new Double(p1.price).compareTo(new Double(p2.price));  
  7.         }  
  8.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值