Comparator::compare设定排序的升序 降序

java.util.Comparator中 compare(T o1, T o2) 函数,其实现决定升序降序。举例如下:对某个对象的var类例进行排序

int compare(T o1, T o2) {
    return o1.var - o2.var;
}

理解升序、降序的三步走:

1 明确 两个变量o1 o2表示序列中前 后的两个变量;位置关系:o1 在前;o2居后;

2 明确返回值表达是否交换位置,正数:交换两者位置; 负数: 不交换;

3 判断是降序还是升序。

升序

int compare(T o1, T o2) {
    return o1.var - o2.var;
}

 分析如下:

1 明确o1在前, o2在后;

2 若o1.var-o2.var为正,则交换位置;为负,不交换位置;

3 若上述为正条件成立,则表明o1.var为大数,大数置后,故为升序;

降序

int compare(T o1, T o2) {
    return o2.var - o1.var;
}

 分析如下:

1 明确o1在前, o2在后;

2 若o2.var-o1.var为正,则交换位置;为负,不交换位置;

3 若上述为正条件成立,则表明o2.var为大数,大数置前,故为降序;

默认升序/降序

int compare(T o1, T o2) {
    return -1;//默认不交换,表示升序
    return 1;//默认交换,表示降序
}

demo代码

package bob.util;
import java.lang.*;
import java.util.*;

class Student {
    int rollno;
    String name, address;

    public Student(int rollno, String name, String address) {
        this.rollno = rollno;
        this.name = name;
        this.address = address;
    }

    public String toString() {
        return this.rollno + " " + this.name + " " + this.address;
    }
}

//自定义升序
class SortbyrollAsc implements Comparator<Student> {
    public int compare(Student a, Student b) {
        return a.rollno - b.rollno;
    }
}

//自定义降序
class SortbyrollDsc implements Comparator<Student> {
    public int compare(Student a, Student b) {
        return b.rollno - a.rollno;
    }
}

//default asc
//默认强制降序
class DefaultDsc implements Comparator<Student> {
    public int compare(Student a, Student b) {
        return 1;
    }
}

//default dsc
//默认强制升序
class DefaultAsc implements Comparator<Student> {
    public int compare(Student a, Student b) {
        return -1;
    }
}

// Main class
public class SortDemo {
    public static void main(String[] args) {
        ArrayList<Student> ar = new ArrayList<Student>();
        ar.add(new Student(141, "Mayank", "london"));
        ar.add(new Student(131, "Anshul", "nyc"));
        ar.add(new Student(161, "Solanki", "jaipur"));
        ar.add(new Student(151, "Aggarwal", "Hongkong"));
        // Display message on console for better readability
        System.out.println("初始化顺序");
        // Iterating over entries to print them
        for (int i = 0; i < ar.size(); i++)
            System.out.println(ar.get(i));

        // Sorting student entries by roll number
        Collections.sort(ar, new SortbyrollAsc());
        // Display message on console for better readability
        System.out.println("\n自定义升序排序");
        // Again iterating over entries to print them
        for (int i = 0; i < ar.size(); i++)
            System.out.println(ar.get(i));

        // Sorting student entries by roll number
        Collections.sort(ar, new SortbyrollDsc());
        // Display message on console for better readability
        System.out.println("\n自定义降序排序");
        // Again iterating over entries to print them
        for (int i = 0; i < ar.size(); i++)
            System.out.println(ar.get(i));

        Collections.sort(ar, new DefaultDsc());
        // Display message on console for better readability
        System.out.println("\n默认强制降序排序");
        // Again iterating over entries to print them
        for (int i = 0; i < ar.size(); i++)
            System.out.println(ar.get(i));

        Collections.sort(ar, new DefaultAsc());
        // Display message on console for better readability
        System.out.println("\n默认强制升序排序");
        // Again iterating over entries to print them
        for (int i = 0; i < ar.size(); i++)
            System.out.println(ar.get(i));
    }
}

### JavaComparator::compare 的用法与实现 在 Java 中,`Comparator::compare` 方法是 `Comparator` 接口的核心部分。该接口定义了用于比较两个对象的规则,而 `compare` 方法则负责执行具体的比较逻辑[^1]。以下是对 `Comparator::compare` 的详细说明以及其实现和使用的示例。 #### 1. Comparator 接口简介 `Comparator` 是一个函数式接口,包含以下两个主要方法: - `int compare(T o1, T o2)`:比较两个对象 `o1` 和 `o2`,返回值为负数表示 `o1 < o2`,零表示 `o1 == o2`,正数表示 `o1 > o2`。 - `boolean equals(Object obj)`:判断当前 `Comparator` 是否与另一个对象相等(通常不需要重写)。 `Comparator` 接口允许开发者自定义排序规则,尤其适用于需要对复杂对象进行排序的场景[^3]。 #### 2. Comparator::compare 的基本用法 `Comparator::compare` 是一个静态方法引用,它可以通过 lambda 表达式或方法引用来简化代码。例如,当需要根据某个字段对列表进行排序时,可以使用 `Comparator.comparing` 或直接传递 lambda 表达式[^2]。 #### 3. 示例代码 以下是几个典型的 `Comparator::compare` 使用示例: ##### 示例 1:按字符串长度排序 ```java import java.util.*; import java.util.function.*; public class Main { public static void main(String[] args) { List<String> list = Arrays.asList("apple", "banana", "cherry", "date"); // 使用 Comparator.comparingInt 按字符串长度排序 list.sort(Comparator.comparingInt(String::length)); System.out.println(list); // 输出: [date, apple, banana, cherry] } } ``` ##### 示例 2:按自然顺序排序 ```java import java.util.*; public class Main { public static void main(String[] args) { List<String> list = Arrays.asList("London", "Paris", "Berlin", "Tokyo"); // 使用 Comparator.naturalOrder 按字母顺序排序 list.sort(Comparator.naturalOrder()); System.out.println(list); // 输出: [Berlin, London, Paris, Tokyo] } } ``` ##### 示例 3:按长整型字段排序 ```java import java.util.*; import java.util.function.*; class Person { private long id; private String name; public Person(long id, String name) { this.id = id; this.name = name; } public long getId() { return id; } @Override public String toString() { return "Person{id=" + id + ", name='" + name + "'}"; } } public class Main { public static void main(String[] args) { List<Person> people = Arrays.asList( new Person(3, "Alice"), new Person(1, "Bob"), new Person(2, "Charlie") ); // 使用 Comparator.comparingLong 按 ID 排序 people.sort(Comparator.comparingLong(Person::getId)); System.out.println(people); // 输出: [Person{id=1, name='Bob'}, Person{id=2, name='Charlie'}, Person{id=3, name='Alice'}] } } ``` #### 4. 自定义 Comparator 示例 如果需要更复杂的排序逻辑,可以手动实现 `Comparator` 接口的 `compare` 方法。例如: ```java import java.util.*; class CustomComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { return Integer.compare(o1 % 10, o2 % 10); // 按最后一位数字排序 } } public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(25, 36, 17, 48, 59); // 使用自定义 Comparator 排序 numbers.sort(new CustomComparator()); System.out.println(numbers); // 输出: [36, 25, 17, 48, 59] } } ``` #### 5. 注意事项 - 如果 `compare` 方法中抛出异常(如空指针异常),可能导致排序失败。 - 在多字段排序时,可以使用 `thenComparing` 方法链式调用多个比较器。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值