通过覆盖 compareTo() 方法根据对象的不同属性对数组进行排序

Sorting an array based on different properties of objects by overriding compareTo() method

我有一个 Student 对象列表,每个对象都有 3 个属性。颜色、尺码及其名称。我想首先根据它们的颜色按升序对它们进行排序,然后按大小降序排列,最后按名称升序排列。 例如,如果输入是(第一行名称,第二行颜色和大小):

Maria Jose
branco P
Mangojata Mancuda
vermelho P
Cezar Torres Mo
branco P
Baka Lhau
vermelho P
JuJu Mentina
branco M
Amaro Dinha
vermelho P
Adabi Finho
branco G
Severina Rigudinha
branco G
Carlos Chade Losna
vermelho P

我希望输出为:

branco P Cezar Torres Mo
branco P Maria Jose
branco M JuJu Mentina
branco G Adabi Finho
branco G Severina Rigudinha
vermelho P Amaro Dinha
vermelho P Baka Lhau
vermelho P Carlos Chade Losna
vermelho P Mangojata Mancuda

但是,在覆盖我的 compareTo() 方法以便列表根据我想要的内容排序后,我得到的输出为:

branco P Maria Jose
branco P Cezar Torres Mo
branco M JuJu Mentina
branco G Adabi Finho
branco G Severina Rigudinha
vermelho P Mangojata Mancuda
vermelho P Baka Lhau
vermelho P Amaro Dinha
vermelho P Carlos Chade Losna

可以看出,颜色和大小排序正确,但是我在排序名称时遇到了问题。我尝试了多种方法,但 none 有效。我不明白为什么。下面是我的 compareTo() 方法:

public int compareTo(Student student) {
    int value1 = color.compareTo(student.color);
    if (value1 < 0) {
        int value2 = size.compareTo(student.size);
        if (value2 < 0) {
            int value3 = name.compareTo(student.name);
            if (value3 < 0) {
                return value3;
            }
        }
    }
    return value1;
}

有人可以帮我吗?

只有当前面的字段相等时,您才应该继续比较其他字段,这意味着您的 compareTo 结果为 0,不大于 0。

你可以看看.

我假设你想根据颜色的升序对数据进行排序,如果颜色相等则你想按大小降序排序,如果大小也相等,则按名称升序排序. 此外,您的 java class 具有所有这些字符串类型的属性。

public int compareTo(Student student) {
    // If color are not equal, sort ascending on color
    if(!this.color.equals(student.color)){
        return this.color.compareTo(student.color);
    }
    // If color are equal, and size is not equal sort descending on size
    if(!this.size.equals(student.size)){
        return student.size.compareTo(this.size);
    }
    // If color and size are equal, sort ascending on name
    return this.name.compareTo(student.name)      
}

Comparator 界面现在提供了更方便地解决问题的方法。

static 变量添加到您的 class。

static Comparator < Student > comparator =
    Comparator
    .comparing( Student :: getColor ) 
    .thenComparing( Student :: getSize ).reversed()
    .thenComparing( Student :: getName() 
;