- 用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方法即可。
- // 自定义比较器:按书的价格排序
- static class PriceComparator implements Comparator {
- public int compare(Object object1, Object object2) {// 实现接口中的方法
- Book p1 = (Book) object1; // 强制转换
- Book p2 = (Book) object2;
- return new Double(p1.price).compareTo(new Double(p2.price));
- }
- }