美文网首页
简述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