Как написать собственный Java компаратор для конкретной строки c? - PullRequest
3 голосов
/ 07 августа 2020

Здравствуйте, мне было интересно, может ли кто-нибудь помочь мне с небольшим количеством кода, на котором я застрял. Итак, я пишу собственный компаратор, используя лямбда-выражения. Я хочу сделать следующее. Если имена, которые возвращают .getName (), равны друг другу, тогда я хочу выбрать то, которое является строкой «Вверх» из .getDirection () (в этом случае гарантировано, что одно из них - «Вверх», другое - «Вниз»), иначе мы посмотрим, какой из них в алфавитном порядке выше в зависимости от .getType ().

Пока у меня есть это: (x,y) -> x.getName().equals(y.getName()) ? //confused part : x.getType().compareTo(y.getType) );

Любая помощь будет принята с благодарностью, спасибо.

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

Не надо слишком жадничать с лаконичностью. Замыкания - это хорошо, но цель не в том, чтобы написать наименьшее количество кода, а в том, чтобы написать только тот код, который необходим для выполнения работы таким образом, который легко понять (ну, в любом случае, большую часть времени ...)

(x, y) -> {
    if (x.getName().equals(y.getName()) {
        return "Up".equals(x.getDirection()) ? -1 : 1;
    } else {
        return x.getType().compareTo(y.getType());
    }
}
2 голосов
/ 07 августа 2020

Я создал пример класса, надеюсь, он поможет.

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'}
1 голос
/ 07 августа 2020

Вы не можете записать это как компаратор.

Предположим, у вас есть следующие объекты:

  • A1: Имя: A Направление: Вниз Тип: 1
  • A3: Имя: A Направление: Вверх Тип: 3
  • B2: Имя: B Направление: Вверх Тип: 2

Согласно вашему logi c, A1 переходного свойства генерального договора компаратора.

...