通过覆盖 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()
;
我有一个 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()
;