zoukankan      html  css  js  c++  java
  • java 排序

    普通类型排序

    1、Integer排序

    实现类的代码如下,Integer实现了Comparable接口,实现了该接口的comparaTo方法

    public final class Integer extends Number implements Comparable<Integer> {
        
        @override
        public int compareTo(Integer anotherInteger) {
            return compare(this.value, anotherInteger.value);
        }
        
        
        public static int compare(int x, int y) {
            return (x < y) ? -1 : ((x == y) ? 0 : 1);
        }
    }
    

    2、Character排序

    实现类如下,Character实现了Comparable接口,重写了该接口的comparaTo方法,通过比较字符的unicode,比如a为97,A为65

    public final class Character implements java.io.Serializable, Comparable<Character> {
        
        public int compareTo(Character anotherCharacter) {
            return compare(this.value, anotherCharacter.value);
        }
        
        public static int compare(char x, char y) {
            return x - y;
        }
        
        
    }
    

    3、String 排序

    String的排序规则为:

    • 如果两个字符串的长度相等,那么从第一个字符比较,如果相等则比较下一个字符串,如果不相等则返回两个字符串的差值
    • 如果字符串的长度不相等,则返回两个字符串的长度之差
    public int compareTo(String anotherString) {
            int len1 = value.length;
            int len2 = anotherString.value.length;
            int lim = Math.min(len1, len2);
            char v1[] = value;
            char v2[] = anotherString.value;
    
            int k = 0;
            while (k < lim) {
                char c1 = v1[k];
                char c2 = v2[k];
                if (c1 != c2) {
                    return c1 - c2;
                }
                k++;
            }
            return len1 - len2;
        }
    

    4、日期的比较

    • 源码
    public int compareTo(Date anotherDate) {
            long thisTime = getMillisOf(this);
            long anotherTime = getMillisOf(anotherDate);
            return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
        }
    

    自定义类排序

    排序的实体类都实现了comparable接口,次接口中只有一个方法public int compareTo(Object obj)

    返回值 解释
    0 this = obj
    正数 this > obj
    负数 this < obj

    1、 排序类实现Comparable接口

    • 若一个类实现了Comparable接口,就意味着“该类支持排序”。 假设“有一个List列表(或数组),里面的元素是实现了Comparable接口的类”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。

    • 此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器

    2、 Comparator比较器接口

    • 我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);我们可以建立一个“比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
    
    // list需要排序的容器
    
    // new ... 实现comparable接口的类
    
    // 返回值是int
    
    // o1 在前 则从大到小排序
    
    // o1  在后 
     Collections.sort(list, new Comparator<People>() {
                @Override
                public int compare(People o1, People o2) {
                    return (o2.getAge()-o1.getAge());
                }
            });
    

    3、两者的区别

    Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。

    一个小小的程序员
  • 相关阅读:
    今天晚上有个什么样的博文呢
    STM8CubeMx来了
    开博啦
    Authentication
    文件上传设计要点
    分布式杂记
    SQL Server 知识集
    C# 集合使用误区
    网络知识集
    关于 elasticsearch 近实时特征的思考
  • 原文地址:https://www.cnblogs.com/zhaod/p/9119492.html
Copyright © 2011-2022 走看看