Java如何自定义排序

Posted by 小拳头 on Wednesday, October 14, 2020

Comparable接口

自定义的类自定义排序需要implementsComparable并且重写public int compareTo(Object o)

  1. String等包装类实现了Comparable接口, 重写了compareTo(obj)方法, 实现升序排列
  2. compareTo(obj): 当前对象this大于形参对象obj, 返回正整数. 小于返回负整数. 相等返回0.

Comparator接口

Comparator多用于自定义排序已有的类, 比如多维数组, 自定义排序String等. 如果当前类没有实现Comparable, 那么也就只能借助Comparator. 需要重写compare(Object o1, Object o2), 比较o1/o2大小. 返回正整数, 则o1大于o2. 其他同理.

import java.util.Arrays;
import java.util.Comparator;

// 倒序排列
public class Compare {
    public static void main(String[] args) {
        Integer[] arr = {3, 2, 7, 4, -1, 6};

        // 实现类去实现Comparator接口, 一次性
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 instanceof Integer && o2 instanceof  Integer) {
                    if (o1 < o2) {
                        return 1;
                    } else if (o1 > o2) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
                return 0;
            }
        });
        for (int i: arr) System.out.println(i);
    }
}

当然实际中要倒序, 可以转换为Collection集合类, 再Collections.reverse().

Lambda

上面的还是写太多, 用Lambda更容易(Java8后). 编译器自动判断a, b的类型和返回值的类型, 但是要注意不能是primitive的类型.

Arrays.sort(arr, (a, b) -> {
    return b.compareTo(a);
});

其中compareTo调用了静态方法compare:

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

哈希表排序

如果是只需要对key排序, 那么直接new ArrayList(map.keySet())即可. 如果是value排序的话, 直接new ArrayList(map.values()). 有时候需要两者一起排序, 那么就需要借助map.entrySet().

@Test
public void test() {
    HashMap<String, Integer> map = new HashMap<>();
    map.put("A", 5);
    map.put("C", 3);
    map.put("B", 2);

    ArrayList<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
    System.out.println(list); //[A=5, B=2, C=3]
    list.sort((a, b) -> {
        return a.getValue().compareTo(b.getValue());
    });
    System.out.println(list); //[B=2, C=3, A=5]
}

参考

  1. Java核心技术
  2. comparable自然排序

comments powered by Disqus