Java集合排序(面试必考点之一)

集合是Java面试必考知识点,而集合的排序也是非常重要的,工作中经常用到,那么这个知识点也是必须要掌握的,下面是我曾经面试时被面试官问的问题:

根据API可知,Java集合的工具类Collections提供了两种排序方式:Collections.sort(List list) 和 Collections.sort(List list,Comparator c)。

第一种方式称为自然排序(一般是升序),参与排序的对象需实现comparable接口,重写其compareTo()方法。

第二种方式称为自定义排序,需编写匿名内部类(匿名内部类后面篇章会讲解),先new一个Comparator接口的比较器对象,同时实现compare()其方法,
然后将待排序的List列表对象和比较器对象传给Collections.sort()方法的参数列表中实现排序功能。

特点:第一种方式相对简单,容易掌握(尤其是对匿名内部类不熟悉的同学),由于待比较对象需要实现comparable,增加了耦合度,属性规则排序不够灵活。

第二种方式只需要在需要排序的地方,创建一个内部类的实例,重写其方法即可,灵活度更大。

 下面以Person类为例写一个分别按照年龄和姓名排序的例子:

public class Person implements Comparable<Person> {    
    private int age;    
    private String name;    
    public int getAge() {        
        return age;
     }   
     public void setAge(int age) {        
         this.age = age;
     }    
     public String getName() {        
        return name;
     }    
     public void setName(String name) {       
         this.name = name;
     }    
     public Person(int age, String name) {       
        super();       
        this.age = age;        
        this.name = name;
     }

    @Override    
    public int compareTo(Person o) {        
        if (this.age > o.age) {            
            return 1;
        } else if (this.age < o.age) {            
            return -1;
        } else {           
            return 0;
        }
    }    
     public static void main(String[] args) {
        List<Person> pList = new ArrayList<>();
        Person p1 = new Person(10, "a张三");
        Person p2 = new Person(18, "c李四");
        Person p3 = new Person(20, "b王五");
        Person p4 = new Person(15, "d陈六");
        pList.add(p1);
        pList.add(p2);
        pList.add(p3);
        pList.add(p4);

        System.out.println("排序前依次输出:");        
        for (Person p : pList) {
            System.out.println(p.age + "===" + p.name);
        }        
        // 按照年龄升序排序(默认)        
        Collections.sort(pList);
        System.out.println("按年龄升序排序后依次输出:");        
        for (Person p : pList) {
            System.out.println(p.age + "===" + p.name);
        }        
        // 按照年龄倒叙排序        
        Collections.reverse(pList);
        System.out.println("按年龄倒叙排序后依次输出:");        
        for (Person p : pList) {
            System.out.println(p.age + "===" + p.name);
        }       
         // 按照姓名升序排序
        Collections.sort(pList, new Comparator<Person>() {
            @Override           
            public int compare(Person o1, Person o2) {                
                return o1.getName().compareTo(o2.getName());
            }
        });
        System.out.println("按照姓名升序排序后依次输出:");        
        for (Person p : pList) {
            System.out.println(p.age + "===" + p.name);
        }
    }
}

排序前依次输出:
10===a张三
18===c李四
20===b王五
15===d陈六
按年龄升序排序后依次输出:
10===a张三
15===d陈六
18===c李四
20===b王五
按年龄倒叙排序后依次输出:
20===b王五
18===c李四
15===d陈六
10===a张三
按照姓名升序排序后依次输出:
10===a张三
20===b王五
18===c李四
15===d陈六

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值