如何为特定字符串编写自定义Java比较器?

如何为特定字符串编写自定义Java比较器?,java,lambda,comparator,Java,Lambda,Comparator,你好,我想知道是否有人能帮我写一点我一直在写的代码。因此,我正在使用lambda语句编写一个自定义比较器,我希望执行以下操作。如果返回的.getName()的名称彼此相等,那么我想从.getDirection()中选择字符串“Up”(在这种情况下,保证其中一个是“Up”,另一个是“Down”),否则我们将根据.getType()来确定哪个名称的字母顺序更高 到目前为止,我有: (x,y)->x.getName().equals(y.getName())//混淆部分:x.getType().com

你好,我想知道是否有人能帮我写一点我一直在写的代码。因此,我正在使用lambda语句编写一个自定义比较器,我希望执行以下操作。如果返回的.getName()的名称彼此相等,那么我想从.getDirection()中选择字符串“Up”(在这种情况下,保证其中一个是“Up”,另一个是“Down”),否则我们将根据.getType()来确定哪个名称的字母顺序更高

到目前为止,我有:
(x,y)->x.getName().equals(y.getName())//混淆部分:x.getType().compareTo(y.getType))


非常感谢您的帮助。

我创建了一个示例类,希望能有所帮助

package-com;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
/**
*@作者张金雷
*/
公共类比较测试{
静态级轿车{
字符串名;
布尔向上;
字符串类型;
Car(字符串名称、布尔值向上、字符串类型){
this.name=名称;
this.up=up;
this.type=type;
}
公共字符串getName(){
返回此.name;
}
公共布尔值isUp(){
把这个还给我;
}
公共字符串getType(){
返回此.type;
}
@凌驾
公共字符串toString(){
返回“Car{”+
“name=”+name+“\”+
“,up=“+up”+
,type=''+type+'\''+
'}';
}
}
公共静态void main(字符串[]args){
Car carA=新车(“新车”,假,“2020型”);
Car carB=新车(“新车”,正确,“2019型”);
Car carC=新车(“旧车”,正确,“1990型”);
List cars=new ArrayList();
加上(卡拉);
汽车。添加(碳水化合物);
添加(carC);
集合。分类(汽车,(x,y)->{
如果(x.getName().equals(y.getName())){
返回x.isUp()?-1:1;
}
返回x.getType().compareTo(y.getType());
});
用于(var汽车:汽车){
系统输出打印(car);
}
}
}
输出

Car{name='OldCar', up=true, type='type1990'}
Car{name='NewCar', up=true, type='type2019'}
Car{name='NewCar', up=false, type='type2020'}

不要试图变得过于简练。闭包很好,但目标不是编写最少的代码,而是只编写以易于理解的方式完成工作所需的代码(当然,大多数情况下…)


您不能将其作为比较器写入。

假设您有以下对象:

  • A1:名称:A方向:向下类型:1
  • A3:名称:A方向:向上类型:3
  • B2:名称:B方向:上行类型:2

根据您的逻辑,A1如果返回.getName()的名称彼此相等,那么我想选择字符串“Up”(在这种情况下保证其中一个是“Up”)的名称-->什么是“Up”来自?让我来编辑我的问题,我弄糟了。我遗漏了一部分。你能澄清一下吗?如果两个对象的名称相等,您要比较哪些字段以及如何比较?因此,我们要比较相同类型的两个对象。getName()和.getDirection()返回字符串。因此,如果x.getName()的字符串与y.getName()的字符串相同,那么我将查看x.getDirection()或y.getDirection()是否是字符串“Up”。保证只有一个“向上”。如果x.getName()和y.getName()不相同,那么我将调用x.getType()和y.getType(),并按字母顺序选择它们。好的,检查x.getDirection()或y.getDirection()是否为字符串“Up”。假设x.getDirection()为“向上”。现在发生了什么?是的,似乎是这样。知道OP为什么不会得到运行时异常声明违规吗?它是否在1.8之后被删除?他们可能会在某个时候出现异常。排序算法只有在检测到一个违规时才会报告违规,它不会特意去寻找违规。
(x, y) -> {
    if (x.getName().equals(y.getName()) {
        return "Up".equals(x.getDirection()) ? -1 : 1;
    } else {
        return x.getType().compareTo(y.getType());
    }
}