码迷,mamicode.com
首页 > 编程语言 > 详细

list自定义排序

时间:2021-05-24 03:21:54      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:空指针   equal   指定   lse   缺陷   public   rgba   test   dHash   

compareTo()方法:a.compareTo(b),如果a<b return -1,如果 a>b return 1   在下列的排序中,如果a<b,则返回-1,正常递增排序,如果a>b,返回1,则a和b的位置替换下。

public
class EqualsAndHashCode { private List<Student>list; @Test public void testCompare(){ System.out.println("list = " + list); list.sort((Student o1,Student o2)->{ /**规则:返回值<0 o1,o2....正常递增顺序 * 当o1==null时,o2!=0时,如果我希望null在前面,则值<0 * 当o1!=null,o2==null,时,null在前面,则让值>0,反之亦然*/ /**正常递增顺序写法1*/ // o1==null?(o2==null?0:-1):(o2==null?1:o1.getAge()-o2.getAge()); // o1==null?(o2==null?0:Integer.MIN_VALUE):(o2==null?Integer.MAX_VALUE:o1.getAge().compareTo(o2.getAge())) if(o1==o2) return 0; if(o1==null){ return -1; }else if(o2==null){ return 1; }else { return o1.getAge()-o2.getAge(); } }); System.out.println("排序后===========================排序后"); System.out.println(list); } @Before public void init(){ list=new LinkedList<>(); list.add(null); list.add(new Student(0,"第零",new User("baiuser"))); list.add(new Student(1,"第一",new User("baiuser"))); list.add(null); list.add(new Student(2,"第二",new User("zhaowen"))); list.add(new Student(4,"第三",new User("wangmancang"))); list.add(new Student(3,"第四",new User("wangmancang"))); list.add(null); } } @Data @ToString @AllArgsConstructor @NoArgsConstructor class Student{ private Integer age; private String name; private User user; } @Data @ToString @AllArgsConstructor @NoArgsConstructor class User{ private String userName; }

数据输出:

list = [null, Student(age=0, name=第零, user=User(userName=baiuser)), Student(age=1, name=第一, user=User(userName=baiuser)), null, Student(age=2, name=第二, user=User(userName=zhaowen)), Student(age=4, name=第三, user=User(userName=wangmancang)), Student(age=3, name=第四, user=User(userName=wangmancang)), null]
排序后===========================排序后
[null, null, null, Student(age=0, name=第零, user=User(userName=baiuser)), Student(age=1, name=第一, user=User(userName=baiuser)), Student(age=2, name=第二, user=User(userName=zhaowen)), Student(age=3, name=第四, user=User(userName=wangmancang)), Student(age=4, name=第三, user=User(userName=wangmancang))]

方法二:

使用 Collections.sort方法排序,缺陷,当this对象为null时,会报空指针异常

public class EqualsAndHashCode {
    private List<Student>list;
    @Test
    public void testCompare(){
        Collections.sort(list);
        System.out.println(list);
    }

    @Before
    public void init(){
        list=new LinkedList<>();
        list.add(null);
        list.add(new Student(0,"第零",new User("baiuser")));
        list.add(new Student(1,"第一",new User("baiuser")));
        list.add(new Student(2,"第二",new User("zhaowen")));
        list.add(new Student(4,"第三",new User("wangmancang")));
        list.add(new Student(3,"第四",new User("wangmancang")));
       // list.add(null);
    }
}
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
class Student implements Comparable<Student>{
    private Integer age;
    private String name;
    private User user;

    @Override
    public int compareTo(Student o) {
        if(this==o){
            return 0;
        }else if(null==this){
            return -1;
        }else if(null==o){
            return 1;
        }else {
           // System.out.println();
            return age-o.age;
        }

    }
}
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
class User{
    private String userName;
}

解决方法:在方法中直接指定比较器,compare方法可以去掉compareTo()方法的弊端

 @Test
    public void testCompare(){
        Collections.sort(list,(Student o1,Student o2)->{
            return o1==null?(o2==null?0:-1):(o2==null?1:o1.getAge()-o2.getAge());
        });
        System.out.println(list);
    }

 

list自定义排序

标签:空指针   equal   指定   lse   缺陷   public   rgba   test   dHash   

原文地址:https://www.cnblogs.com/baierhu/p/14747003.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!