Compareable和Compartor

Comparable api 解读

该接口给每个对象进行自然排序,它的compareTo 方法就是自然排序的方法。

实现该接口,只是说明该对象可以比较。

如果一个对象实现了该接口,也就意味着可以通过Collections.sort and Arrays.sort 等排序方法进行排序。

实现该接口,必须实现compareTo,实现具体比较逻辑。

package com.example.test;

public class People implements Comparable<People>  {
   private String name;
   private int age;
   public People(String name, int age) {
    super();
    this.name = name;
    this.age = age;
   }

public String getName() {
    return name;
}


public int getAge() {
    return age;
}

@Override
public int compareTo(People o) {
    // TODO Auto-generated method stub

    return o.age-age;
   }
}

javabean对象,必须实现Comparable接口,才可以比较,不能调用sort报错。

 static List<People> list = new ArrayList<>();
   public static void main(String[] args) {
      list.add(new People("liu", 23));
      list.add(new People("liu2", 24));
      list.add(new People("liu3e", 33));
      list.add(new People("liu4", 13));
      list.add(new People("liu5", 22));
      Collections.sort(list);


      for(int i =0;i<list.size();i++) {
          System.out.println(list.get(i).getAge());
      }

   }
Comparator api解读

强行对某个对象 collection 进行整体排序 的比较函数,它可以实现排列顺序精确控制,或者为那些没有自然顺序的对象 collection 提供排序。(也就是没有实现Comparerable接口)

Comparator 的功能更强大。

将上述的javbean对象,不去实现Compareable接口。

static List<People> list = new ArrayList<>();
   public static void main(String[] args) {
          list.add(new People("liu", 23));
          list.add(new People("liu2", 24));
          list.add(new People("liu3e", 33));
          list.add(new People("liu4", 13));
          list.add(new People("liu5", 22));
          Collections.sort(list,new Comparator<People>() {//构造匿名内部类对象

            @Override
            public int compare(People o1, People o2) {
                // TODO Auto-generated method stub
                return o1.getAge()-o2.getAge();
            }
        });
          for(int i =0;i<list.size();i++) {
              System.out.println(list.get(i).getAge());
          }
    }
如何给Map进行排序

我们要知道Map内部的数据是通过什么去组织,这里以hashmap为例子。

 transient Node<K,V>[] table;//定义了一个Node结点数组
 static class Node<K,V> implements Map.Entry<K,V> {

查看Entry,是一个接口,里面提供了相应key-value的set、get方法。
到这里我们其实就可以看出Entry很像javabean对象,来封装key-value的。

我们常称Entry为条目。

Entry详解

有了上述的前提知识,下面对于map的排序就会很好理解。

我们知道Map中装的是Entry对象,我们让Entry可以排序就好了。

  • 一种你写一个Entry类实现Entry,并且实现Compareable,就可以比较。
  • 看例子
  Set s = map.entrySet();//获取map的条目集合
      List<Map.Entry<String,Integer>> l =  new ArrayList<>(s);//这里需要注意将set构造成List,才可以调用 Collections.sort方法排序
       Collections.sort(l,new Comparator<Map.Entry<String,Integer>>() {
        @Override
        //这里比较是List中的条目Entry两个对象的值来排序
        public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
            // TODO Auto-generated method stub
            return o2.getValue()-o1.getValue();
        }
     });
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值