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来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。

posted @ 2018-05-31 22:52  墮落方能自由  阅读(800)  评论(0编辑  收藏  举报