如何为特定字符串编写自定义 Java 比较器?
How Do You Write A Custom Java Comparator For A Specific String?
你好,我想知道是否有人可以帮助我解决我遇到的一些问题。所以我正在使用 lambda 语句编写一个自定义比较器,我想执行以下操作。如果 .getName() 的 return 的名称彼此相等,那么我想从 .getDirection() 中选择一个字符串“Up”(在这种情况下保证其中之一是“Up” , 另一个是 "Down"), 否则我们将根据 .getType().
查看哪个字母顺序更高
到目前为止我有这个:
(x,y) -> x.getName().equals(y.getName()) ? //confused part : x.getType().compareTo(y.getType) );
如有任何帮助,我们将不胜感激。
我创建了一个例子class,希望对你有帮助。
package com;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author jinleizhang
*/
public class ComparatorTest {
static class Car {
String name;
boolean up;
String type;
Car(String name, boolean up, String type) {
this.name = name;
this.up = up;
this.type = type;
}
public String getName() {
return this.name;
}
public boolean isUp() {
return this.up;
}
public String getType() {
return this.type;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", up=" + up +
", type='" + type + '\'' +
'}';
}
}
public static void main(String[] args) {
Car carA = new Car("NewCar", false, "type2020");
Car carB = new Car("NewCar", true, "type2019");
Car carC = new Car("OldCar", true, "type1990");
List<Car> cars = new ArrayList<>();
cars.add(carA);
cars.add(carB);
cars.add(carC);
Collections.sort(cars, (x, y) -> {
if (x.getName().equals(y.getName())) {
return x.isUp() ? -1 : 1;
}
return x.getType().compareTo(y.getType());
});
for (var car : cars) {
System.out.println(car);
}
}
}
输出
Car{name='OldCar', up=true, type='type1990'}
Car{name='NewCar', up=true, type='type2019'}
Car{name='NewCar', up=false, type='type2020'}
不要贪图简洁。闭包很好,但是 objective 并不是要编写最少的代码,而是只编写以易于理解的方式完成工作所需的代码(好吧,无论如何大多数时候.. .)
(x, y) -> {
if (x.getName().equals(y.getName()) {
return "Up".equals(x.getDirection()) ? -1 : 1;
} else {
return x.getType().compareTo(y.getType());
}
}
你不能把它写成比较器。
假设您有这些对象:
- A1:名称:A 方向:向下类型:1
- A3:名称:A 方向:向上 类型:3
- B2:名称:B 方向:向上 类型:2
按照你的逻辑,A1 < B2,B2 < A3,A3 < A1。这违反了comparator总契约的传递性属性。
你好,我想知道是否有人可以帮助我解决我遇到的一些问题。所以我正在使用 lambda 语句编写一个自定义比较器,我想执行以下操作。如果 .getName() 的 return 的名称彼此相等,那么我想从 .getDirection() 中选择一个字符串“Up”(在这种情况下保证其中之一是“Up” , 另一个是 "Down"), 否则我们将根据 .getType().
查看哪个字母顺序更高到目前为止我有这个:
(x,y) -> x.getName().equals(y.getName()) ? //confused part : x.getType().compareTo(y.getType) );
如有任何帮助,我们将不胜感激。
我创建了一个例子class,希望对你有帮助。
package com;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author jinleizhang
*/
public class ComparatorTest {
static class Car {
String name;
boolean up;
String type;
Car(String name, boolean up, String type) {
this.name = name;
this.up = up;
this.type = type;
}
public String getName() {
return this.name;
}
public boolean isUp() {
return this.up;
}
public String getType() {
return this.type;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", up=" + up +
", type='" + type + '\'' +
'}';
}
}
public static void main(String[] args) {
Car carA = new Car("NewCar", false, "type2020");
Car carB = new Car("NewCar", true, "type2019");
Car carC = new Car("OldCar", true, "type1990");
List<Car> cars = new ArrayList<>();
cars.add(carA);
cars.add(carB);
cars.add(carC);
Collections.sort(cars, (x, y) -> {
if (x.getName().equals(y.getName())) {
return x.isUp() ? -1 : 1;
}
return x.getType().compareTo(y.getType());
});
for (var car : cars) {
System.out.println(car);
}
}
}
输出
Car{name='OldCar', up=true, type='type1990'}
Car{name='NewCar', up=true, type='type2019'}
Car{name='NewCar', up=false, type='type2020'}
不要贪图简洁。闭包很好,但是 objective 并不是要编写最少的代码,而是只编写以易于理解的方式完成工作所需的代码(好吧,无论如何大多数时候.. .)
(x, y) -> {
if (x.getName().equals(y.getName()) {
return "Up".equals(x.getDirection()) ? -1 : 1;
} else {
return x.getType().compareTo(y.getType());
}
}
你不能把它写成比较器。
假设您有这些对象:
- A1:名称:A 方向:向下类型:1
- A3:名称:A 方向:向上 类型:3
- B2:名称:B 方向:向上 类型:2
按照你的逻辑,A1 < B2,B2 < A3,A3 < A1。这违反了comparator总契约的传递性属性。