如何为特定字符串编写自定义 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总契约的传递性属性