美文网首页
简述Comparator和Collections.sort(),

简述Comparator和Collections.sort(),

作者: 小烈yhl | 来源:发表于2019-01-03 22:57 被阅读0次

    关于comparator与comparable

    comparable实现了

    int compareTo(T o) 
    

    此接口,a.compare(b),如果a大于b返回1,a小于b返回负数;

    comparator实现了

    int compare(T o1, T o2) 
    

    o1>o2返回正数,o1==o2返回0,o1<o2返回负数;
    *由于以上两个方法都不是static method所以实现接口时,需要实现接口内方法。

    对于Arrays.sort与Collections.sort排序一般用comparator接口,一是易于实现,二是可以用lambda表达式表达。

    关于Arrays.sort与Collection.sort的理解

    Arrays.sort一般用于排序数组
    Collection.sort一般用于排序列表

    实现comparator接口的collection一般用法

    public class sortTest {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList();
            for (int i = 10; i > 0; i--)
                list.add(i);
            System.out.print(list);//输出原先顺序
            
            Collections.sort(list, new newComp());
            
            System.out.println();
            System.out.print(list);//输出后来顺序
        }
    }
    
    class newComp implements Comparator<Integer> {
    
    
        @Override
        public int compare(Integer o1, Integer o2) {
            // TODO Auto-generated method stub
            return o1.compareTo(o2);//升序
        }
    }
    

    稍微高级一点的写法,就是把方法写在Collections.sort()的括号里

    public class sortTest {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList();
            for (int i = 10; i > 0; i--)
                list.add(i);
            System.out.print(list);//输出原先顺序
            
            Collections.sort(list, new Comparator<Integer>() {
            @Override
                public int compare(Integer o1, Integer o2) {
                    // TODO Auto-generated method stub
                    return o1.compareTo(o2);//升序
                }});
            
            System.out.println();
            System.out.print(list);//输出后来顺序
        }
    }
    
    

    再高级一点,用lambda表达式

    public class sortTest {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList();
            for (int i = 11; i > 0; i--)
                list.add(i);
            System.out.print(list);//输出原先顺序
            
            Comparator<Integer> cmp = (Integer o1,Integer o2)->{return o1.compareTo(o2);};
            Collections.sort(list, cmp);
            
            System.out.println();
            System.out.print(list);//输出后来顺序
        }
    }
    
    

    再高级一点?lambda直接用list里面的sort方法而不用Collection的

    public class sortTest {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList();
            for (int i = 10; i > 0; i--)
                list.add(i);
            System.out.print(list);//输出原先顺序
            
            list.sort((Integer o1,Integer o2)->{return o1 - o2;});
            
            System.out.println();
            System.out.print(list);//输出后来顺序
        }
    }
    

    很好,我觉得差不多了,关于

    Arrays.sort(people,Comparator.comparing(Person::getName));
    

    这种东西我不会,也不想会,88。

    最后再说说关于基于collections.sort()的HashMap的排序

    众所周知,HashMap把东西放进去之后啊,顺序就不是原来放入的顺序了,他有自己那一套?具体我也不知道。
    所以这里我们要对放入进HashMap的东西排序。

    主要分三步
    1、首先把HashMap的map变为Set<Entry<E,V>>
    2、然后新建列表List<Entry<E,V>>
    3、通过Comparator 排序List
    这样我们的List就有序啦,再通过iterator的foreach输出即可!

    具体实现如下

    Set<Entry<String, Integer>> set  = map.entrySet();
            List<Entry<String,Integer>> list = new ArrayList<>(set);
            Collections.sort(list, new Comparator<Entry<String,Integer>>(){
    
                @Override
                public int compare(Entry<String, Integer> arg0, Entry<String, Integer> arg1) {
                    // TODO Auto-generated method stub
                    return arg1.getValue().compareTo(arg0.getValue());
                }
                
            });
    

    高级一点的写法。。。。。

    List<Entry<String,Integer>> list = new ArrayList<>(map.entrySet());
    
    Comparator<Entry<String, Integer>> cmp = (Entry<String, Integer> arg0, Entry<String, Integer> arg1)->{return arg1.getValue().compareTo(arg0.getValue());};
    
    Collections.sort(list,cmp);
            
    for (Map.Entry<String, Integer> e : list) 
    System.out.println(e.getKey() + " " + e.getValue());
    

    相关文章

      网友评论

          本文标题:简述Comparator和Collections.sort(),

          本文链接:https://www.haomeiwen.com/subject/buaqrqtx.html