• java List排序方法 Comparator和Comparable


    今天写的一个程序中需要对一个List进行排序,突然发现自己对这个问题一无所知,于是查阅资料并进行测试,在此做个记录。

    Collections工具类中有两个方法可以对List进行排序,分别为:

    1. public static <T extends Comparable<? super T>> void sort(List<T> list)
    2. public static <T> void sort(List<T> list, Comparator<? super T> c)

    从函数签名中可以看出,实现Comparable 或 Comparator接口 即可对List中的元素进行排序,测试代码如下,一看就明白

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.LinkedList;
    import java.util.List;
    
    public class SortList {
    
        public static void main(String[] args) {
            List<Entry> ll = new LinkedList<Entry>();//此处可为ArrayList
            ll.add(new Entry(3));
            ll.add(new Entry(10));
            ll.add(new Entry(7));
            ll.add(new Entry(99));
            Collections.sort(ll, new Comparator<Entry>(){
                public int compare(Entry o1,Entry o2){
                    if(o1.getA()<o2.getA()){
                        return -1;
                    }
                    else if(o1.getA()>o2.getA())
                        return 1;
                    return 0;
                }
            });
            for(Entry t:ll){
                System.out.println(t.getA());
            }
        }
    
    }
    
    class Entry{
    
        private int a;
    
        public Entry(int a){
            this.a = a;
        }
        
        public int getA(){
            return a;
        }
    }

    运行结果为:

    3
    7
    10
    99

    另外一种方法为:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.LinkedList;
    import java.util.List;
    
    public class SortList {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            List<Entry> ll = new LinkedList<Entry>();
            ll.add(new Entry(3));
            ll.add(new Entry(10));
            ll.add(new Entry(7));
            ll.add(new Entry(99));
            Collections.sort(ll);
            for(Entry t:ll){
                System.out.println(t.getA());
            }
        }
    
    }
    
    class Entry implements Comparable{
    
        private int a;
    
        public Entry(int a){
            this.a = a;
        }
        
        public int getA(){
            return a;
        }
        
        @Override
        public int compareTo(Object o) {
            Entry t = (Entry) o;
            if(this.a>t.a){
                return -1;
            }
            else if(this.a<t.a)
                return 1;
            else
                return 0;
        }
        
    }

    运行结果为:

    99
    10
    7
    3

    两种方法的效果都是一样的,不过使用Comparator接口的话,可以实现排序算法和业务逻辑相分离。对于一些已经实现的类也可以用Comparator来实现排序,而无需修改已实现的类。

  • 相关阅读:
    第一期知识点
    如何正确地停止一个线程?
    JVM知识点总览-高级Java工程师面试必备
    常见GC算法,CMS以及G1的垃圾回收过程,CMS的各个阶段哪两个是Stop the world的,CMS会不会产生碎片,G1的优势。
    深入理解分布式事务,高并发下分布式事务的解决方案
    JVM中的逃逸分析
    JVM内存初学 堆、栈、方法区
    JVM方法栈的工作过程,方法栈和本地方法栈有什么区别。
    JVM的基本结构和JVM的内存结构
    一致性hash算法应用场景、详解与实现(JAVA)
  • 原文地址:https://www.cnblogs.com/cruze/p/3712502.html
Copyright © 2020-2023  润新知