记录:列表排序(一)

文章来源——JAVA程序员成功面试秘籍

  1. 列表排序经常采用自然排序(natural ordering),如按照从小到大的顺序排列数字或按照字母表的顺序排列字符。若对排列顺序有不同的需求,Java提供两个帮助排序的接口:Comparable Comparator
  2. 两者区别:Comparable 接口用于自然排序,而 Comparator 接口则用于需要对排序的顺序进行精准控制的情形
  3. 对数组排序时,通常使用内置的库,如 Arrays 和 Collections 类中实现的排序算法 sort 方法。这些方法大体上可以分为两类:一类接受一个数组作为参数,另一类接受一个数组和一个 Comparator 对象作为参数。
  4. 如果想要提供自定义的排序方法,可以实现 sort 方法所需要的 Comparator 接口。这个接口有两种方法,一个是实现类型T比较的 int compare(T o1, T o2)方法,另一个是boolean equals(Object o)方法。compare方法返回值是负,则表示第一个参数应该在第二个参数之前;为0则表示相等;为正则表示第二个参数应该在第一个参数之前。
//整数数组的自然排序
public void sortInts(){
    final int[] numbers = {-3, -5, 1, 7, 4, -2};
    final int[] expected = {-5, -3, -2, 1, 4, 7};
    
    Arrays.sort(numbers);
    assertArrayEquals(expected,numbers);
}
//对于Object对象数组,要排序的类型必须实现Comparable接口,而String类实现了该接口
public void sortObjects(){
    final String[] strings = {"z", "x" ,"y", "abc", "zzz", "zazzy"};
    final String[] expected = {"abc", "x", "y", "z", "zazzy", "zzz"};
    
    Arrays.sort(strings);
    assertEquals(expected,strings);
}
//如果没有实现Comparable接口,则抛出ClassCastException异常
//实现数值反向排序的Comparator(即从大到小)
public class ReverseNumericalOrder implements Comparator<Integer>{
    @Override
    public int compara(Integer o1, Integer o2){
        return o2-o1;
    }
    //忽略相等的情况,此情况可省略不写
}

@Test
public void customSorting(){
    final List<Integer> numbers = Arrays.asList{4, 7, 1, 6, 3, 5, 4};
    final List<Integer> expected = Arrays.asList{7, 6, 5, 4, 4, 3, 1};

    Collections.sort(numbers, new ReverseNumericalOrder());
    assertEquals(expected, numbers);
}





猜你喜欢

转载自blog.csdn.net/Ilaria_zhong/article/details/80719099