Сортировка списка сопоставимых объектов с использованием нескольких строковых полей в произвольном порядке. - PullRequest
0 голосов
/ 29 июня 2018

С этим классом:

public class MyClass implements Comparable<MyClass> {

    private String status;
    private String name;
    private String firstName;  

    @Override
    public int compareTo(MyClass o) {
        return 0;
    }

}

Я бы хотел отсортировать список объектов MyClass в следующем порядке:

  • Сначала status = "open", затем "working", затем "close"
  • Во-вторых, name = "toto", затем "titi"
  • Наконец, firstName = "tutu", "tata"

Как я могу сделать это с помощью интерфейса Comparable?

1 Ответ

0 голосов
/ 29 июня 2018

Я бы сделал это так: сначала определите набор списков, которые определяют порядок для каждого поля:

private static List<String> statusOrder = Arrays.asList("open", "working", "close");
private static List<String> nameOrder = Arrays.asList("toto", "titi");
private static List<String> firstNameOrder = Arrays.asList("tutu", "tata");

Затем используйте List.indexOf, чтобы получить позицию элемента в списке, а затем просто вычтите результаты:

@Override
public int compareTo(MyClass o) {
    final int statusComp = statusOrder.indexOf(status) - statusOrder.indexOf(o.status);
    if (statusComp != 0) return statusComp;
    final int nameComp = nameOrder.indexOf(name) - nameOrder.indexOf(o.name);
    if (nameComp != 0) return nameComp;
    return firstNameOrder.indexOf(firstName) - firstNameOrder.indexOf(o.firstName);
}

Проблема этого подхода в том, что indexOf вернет -1, если элемент отсутствует в списке. Вам нужно будет определить поведение в случае, когда MyClass содержит нестандартные значения (возможно, это никогда не произойдет).

...