Сортировка ArrayList по LocalDate с пользовательским компаратором - PullRequest
0 голосов
/ 28 января 2019

Я десериализовал некоторый Json и поместил его в модель со следующей структурой:

Модель:

import java.time.LocalDate;

public class MyClass implements Serializable {

    String name;
    LocalDate date;
    // more attributes

    public MyClass(...) {
        // ...        
    }

    // getters & setters
}

Затем я поместил этот класс в ArrayList:List<MyClass> list = new ArrayList<>().Список выглядит следующим образом:

[
  {
    "name": "peter",
    "date": {
      "year": "1984",
      "month": "10",
      "day": "17"
    }
  },
  {
    "name": "steve",
    "date": {
      "year": "1976",
      "month": "05",
      "day": "04"
    }
  }
]

Я знаю, хочу отсортировать list по дате, так что Steve предшествует Peter.


Мой подход таков:

Comparator<Map<String, String>> mapComparator = (Map<String, String> m1, Map<String, String> m2) -> m1.get("date").compareTo(m2.get("date"));
Collections.sort(list, mapComparator);

Но там написано:

Not suitable method found for sort(List<MyClass>,Comparator<Map<String,String>>)

Обратите внимание, что date имеет тип LocalDate, поэтому «объектная структура» dateв ArrayList производится Java автоматически.

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Ваш компаратор сравнивает Map с.Ваш список не является списком Map с.

list.sort(Comparator.comparing(MyClass::getDate));
0 голосов
/ 28 января 2019

вы можете сделать таким образом, используя compareTo

Collections.sort(list, (a,b)->a.getDate().compareTo(b.getDate()));
0 голосов
/ 28 января 2019

Проблема в том, что вы используете карту вместо компаратора MyClass.Вот решение:

Comparator<MyClass> mapComparator = (MyClass m1, MyClass m2) -> m1.getDate().compareTo(m2.getDate());
Collections.sort(list, mapComparator);
...