3. compare方法的排序方法
发布时间:2025-06-24 19:12:59 作者:北方职教升学中心 阅读量:247
Stream<T> sorted(Comparator<? super T> comparator);
Comparator 接口暴露给我们以下方法来实现:
int compare(T o1, T o2);
(1)情况一 : 直接 new Comparator 对象,然后实现其 compare 排序方法。List<Integer> ids = new ArrayList<>();ids.add(1);ids.add(2);ids.add(33);ids.add(4);Collections.sort(ids, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1-o2; }});
List<Integer> ids = new ArrayList<>();ids.add(1);ids.add(2);ids.add(33);ids.add(4);Collections.sort(ids, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1-o2; }});
TIPS:首先要知道 Collections.sort()排序方法时,默认情况下,
从这个角度看,,代码具有更高的可读性,以下实例:
Integer[] a1 = Arrays.stream(a).sorted(Comparator.comparing(new Function<Integer, Integer>() { @Override public Integer apply(Integer integer) { return integer; }}).reversed()).toArray(new IntFunction<Integer[]>() { @Override public Integer[] apply(int value) { return new Integer[value]; }});
2. 对 Collection 对集合类型进行排序。3. compare方法的排序方法。
例如,还是这个代码块。1. 对 Array 对数组类型进行排序。
@Overridepublic int compare(Integer o1, Integer o2) { return o1-o2;}。总结。o1被认为是o1>o2,回到0,
Comparator 类常作为 sorted() 传递方法的参数 sorted 方法,用于解决集合排序,自定义排序规则的问题 。
这种方法只能用于包装类型的数组,如果数组是基本数据类型,使用必须转为包装类才能实现 compare 定义排序方法。
下面是 Arrays 类暴露给我们的排序方法 —— sorted。
(2)情况二: 使用 Comparator 提供的静态方法,链式添加排序规则。o2被认为是>o1,因此,如果将返回逻辑更改为,o2-o1,所以同样的o1=1,o2=2.,返回是2-1=1,然后比较器会认为1>2,比较器会把2排序更前一点(因为它认为2小于1),这就变成了降序排序。public static void test(){ // 排序包装类型的数组 Integer[] a = {1, 2, 3, 0}; // 直接对 a 排序 Arrays.sort(a, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); // 不对 a 排序,而是将 a 给出排序结果 a2 Integer[] a2 = Arrays.stream(a).sorted(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }).toArray(new IntFunction<Integer[]>() { @Override public Integer[] apply(int value) { return new Integer[value]; } }); // 对基本数据类型的数组进行排序 —— 不允许自定义排序规则 int[] b = {1, 3, 2, 4}; Arrays.sort(b); int[] b1 = Arrays.stream(b).sorted().toArray();}。
public static void test(){ // 排序包装类型的数组 Integer[] a = {1, 2, 3, 0}; // 直接对 a 排序 Arrays.sort(a, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); // 不对 a 排序,而是将 a 给出排序结果 a2 Integer[] a2 = Arrays.stream(a).sorted(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }).toArray(new IntFunction<Integer[]>() { @Override public Integer[] apply(int value) { return new Integer[value]; } }); // 对基本数据类型的数组进行排序 —— 不允许自定义排序规则 int[] b = {1, 3, 2, 4}; Arrays.sort(b); int[] b1 = Arrays.stream(b).sorted().toArray();}。
例如,还是这个代码块。
3. compare方法的排序方法
compare方法中有两个参数o1和o2,以int类型为例。这种情况可以发生 compare 内部定义排序规则,看起来很直观通过在 compare 编写逻辑代码,可以实现多种排序规则 。总结。直接创建 Comparator 类实例, 然后重写 compare 定义排序规则的方法。使用 Comparator 排序静态方法,直接用类名调用排序,将相应的排序指标传入方法。
默认情况下,这儿一定要记住。
二、public void test2(){ List<Student> list = new ArrayList<>(); // 对 list 按照 先年龄 后 排序结果的方式 Collections.sort(list, Comparator.comparing(Student :: getAge).thenComparing(Student :: getScore)); // 将 list 按照先成绩 再年龄 方法排序,并赋值结果 list2 List<Student> list2 = list.stream().sorted(Comparator.comparing(Student :: getScore).thenComparing(Student :: getAge)).collect(Collectors.toList());}class Student{ int name; int age; int score; public int getName() { return name; } public void setName(int name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getScore() { return score; } public void setScore(int score) { this.score = score; }}。o1=o2,回到负整数时,一、
- 假如现在开始比较o1值为1,o2值为2,所以return是1-2=-1,返回-1然后在比较器中认为1<2.,这是正常思维,但是,
这样也可以随意定制排序规则,而且相对而言, Comparator 类。Java是升序排序,如果你重写compare方法的逻辑,不管你的compare方法内部如何比较,回到正数,sort是升序排序。