理解Comparator的返回值与sort排序的关系

       一直以来很难正确的理解Collections.sort()中自定义的比较函数Comparato的返回值与排序存在的关系;最近又梳理了一下才有了一些头绪。

 要想记住这个关系,需要认识两个部分:

 1.  public int compare(Integer t2, Integer t1) 中两个参数的含义:

 Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer t2, Integer t1) {
                /**
                 * 首先明确compare的两个参数的含义
                 *  t2: 指的是右边的参数
                 *  t1:指的是左边的参数
                 *
                 *  例如: 100  40  70  16  5  66
                 *        t2: 40 ----- t1: 100
                 *        t2: 70 ----- t1: 40
                 *        t2: 16 ----- t1: 70
                 *        t2: 5  ----- t1: 16
                 *        t2: 66 ----- t1: 5
                 */
                System.out.println("t2: " + t2 + "-----t1: " + t1);

                return 0;
            }
 });

2. 在Collections.sort()的源码中有这样的一段代码:

        /**
         * var3.compare(var0[var4++], var0[var1]) 这个就是调用我们自定义的Compare方法,
         */
        if (var3.compare(var0[var4++], var0[var1]) >= 0) {
            /**
             * 如果返回值 >=0 , 并不会做任何有关排序的处理
             */
            while(var4 < var2 && var3.compare(var0[var4], var0[var4 - 1]) >= 0) {
                ++var4;
            }
        } else {
            /**
             * 如果返回值 < 0 , 会执行——reverseRange(var0, var1, var4)交换顺序
             */
            while(var4 < var2 && var3.compare(var0[var4], var0[var4 - 1]) < 0) {
                ++var4;
            }
            reverseRange(var0, var1, var4);
        }

3. 结论

 当compare的返回值小于0时,会将  t2  和  t1 (compare()中的两个参数)交换顺序,大于等于0不会变换顺序;

 可根据具体的排序需求来决定是否让他们交换顺序

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: 可以使用Java中的Comparator接口来自定义排序Comparator接口有一个compare()方法,用于比较两个对象的大小。如果要对一个数组进行排序,可以使用Arrays.sort()方法,并将自定义的Comparator对象传递给该方法。下面是一个示例代码: ```java // 定义一个Person类 class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } } // 定义一个按照年龄升序排列的Comparator class AgeComparator implements Comparator<Person> { @Override public int compare(Person p1, Person p2) { return p1.age - p2.age; } } // 使用自定义的Comparator对Person数组进行排序 Person[] persons = new Person[]{ new Person("Tom", 20), new Person("Alice", 18), new Person("Bob", 22) }; Arrays.sort(persons, new AgeComparator()); ``` 以上代码将按照年龄的升序对Person数组进行排序。可以根据具体需求编写不同的Comparator来实现自定义排序。 ### 回答2: 在Java中,我们可以使用`Arrays.sort()`方法对数组进行排序。这个方法使用的是默认的自然排序方法,即对数字和字符串进行升序排序。但是,我们也可以自定义排序方法来根据自己的需求对数组进行排序。 自定义排序的方法是通过实现`Comparator`接口来达到的。`Comparator`是一个函数式接口,其中包含一个`compare()`方法,用于比较两个对象的大小。我们需要实现`compare()`方法来定义我们自己的排序逻辑。 例如,假设我们有一个包含整数的数组`int[] arr = {5, 3, 8, 2, 1};`,我们想把它按照数字的奇偶性进行排序,奇数排在前面,偶数排在后面。我们可以这样实现自定义排序方法: ``` import java.util.Arrays; import java.util.Comparator; public class CustomSort { public static void main(String[] args) { int[] arr = {5, 3, 8, 2, 1}; // 自定义排序方法 Comparator<Integer> comparator = (a, b) -> { if (a % 2 == 0 && b % 2 != 0) { // a为偶数,b为奇数,b排在a前面 return 1; } else if (a % 2 != 0 && b % 2 == 0) { // a为奇数,b为偶数,a排在b前面 return -1; } else { // a和b同为奇数或同为偶数,按照数字大小进行排序 return a.compareTo(b); } }; // 使用自定义排序方法对数组进行排序 Arrays.sort(arr, comparator); // 输出排序后的数组 System.out.println(Arrays.toString(arr)); // [1, 3, 5, 2, 8] } } ``` 在上述例子中,我们定义了一个`Comparator`对象`comparator`,它根据数字的奇偶性对数字进行排序。然后,我们使用`Arrays.sort()`方法并传入我们的`comparator`对象来对数组进行排序。最后,我们输出排序后的数组。 总结来说,`Arrays.sort()`方法可以通过自定义`Comparator`接口实现自定义排序。我们可以根据我们的需求实现`Comparator`接口中的`compare()`方法来定义自己的排序逻辑。 ### 回答3: 在使用arrays.sort()方法进行自定义排序时,可以通过实现Comparator接口来达到目的。Comparator接口有一个compare()方法,可以用来比较两个对象的顺序。 首先,我们需要创建一个实现Comparator接口的类。该类的泛型需与要排序的数组类型保持一致。例如,如果要对一个整数数组进行排序,我们可以创建一个自定义比较器类如下: ```java public class CustomComparator implements Comparator<Integer> { public int compare(Integer num1, Integer num2) { // 自定义排序逻辑 // 返回值为负数表示num1应排在num2之前,返回值为正数表示num1应排在num2之后,返回值为0表示两者相等 // 我们可以根据自己的需求来实现具体的排序逻辑 // 以下是一个示例: if (num1 % 2 == 0 && num2 % 2 != 0) { return -1; // 将偶数排在前面 } else if (num1 % 2 != 0 && num2 % 2 == 0) { return 1; // 将奇数排在后面 } else { return num1 - num2; // 其他情况按照数值大小排序 } } } ``` 接下来,我们可以使用这个自定义比较器来进行排序。假设我们有一个整数数组`int[] nums = {5, 2, 9, 1, 7};`,我们可以调用Arrays类的sort()方法并传入自定义比较器来实现自定义排序: ```java int[] nums = {5, 2, 9, 1, 7}; Arrays.sort(nums, new CustomComparator()); ``` 经过以上操作,nums数组将会按照我们定义的规则进行排序。 自定义排序可以灵活地根据需求进行调整,你可以根据自己的实际情况来实现适合的排序逻辑,从而满足自己的排序需求。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Heynchy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值