Сортировка JSONObject по ключу дате Java, алгоритм

379
17 июня 2017, 12:10

Использую JSONSimple. Имею такой Json:

{
  "2017-05-19": [{"time": "time"}],
  "2017-05-18": [{"time": "time"}],
  "2017-05-17": [{"time": "time"}],
  "2017-05-16": [{"time": "time"}],
  "2017-05-01": [{"time": "time"}],
  "2017-05-05": [{"time": "time"}],
  "2017-05-10": [{"time": "time"}],
  "2017-06-18": [{"time": "time"}],
  "2017-06-29": [{"time": "time"}],
  "2017-06-16": [{"time": "time"}],
  "2017-06-01": [{"time": "time"}],
  "2017-06-06": [{"time": "time"}],
  "2017-06-15": [{"time": "time"}]
}

Подскажите варианты сортировки такого объекта по ключу - дате. Что бы всё было в нормальном порядке, как должно быть.

UPD. Попробовал сделать так:

Map<Date, JSONArray> treeMap = new TreeMap<Date, JSONArray>(data);
JSONObject test = new JSONObject(treeMap);

не отсортировал.

JSONObject data = (JSONObject) new JSONParser().parse(new FileReader(request.getServletContext().getRealPath("")+ File.separator+"temp.json"));
                    List<UserRow> list = new ArrayList<>();
                    for(Object o: data.keySet()) {
                        list.add(new UserRow(o.toString(), (JSONArray) data.get(o)));
                    }
                    Collections.sort(list, new Comparator<UserRow>() {
                        @Override
                        public int compare(UserRow o1, UserRow o2) {
                            return o1.getDate().compareTo(o2.getDate());
                        }
                    });
                    JSONObject nData = new JSONObject();
                    for(UserRow u: list) {
                        nData.put(u.dateToString(), u.getTimes());
                    }
                    System.out.println(nData.toString());

Класс UserRow:

public class UserRow {
    private Date date;
    private JSONArray times;
    private SimpleDateFormat fdate = new SimpleDateFormat("yyyy-MM-dd");
    public UserRow(String date, JSONArray times) throws ParseException {
        this.date = fdate.parse(date);
        this.times = times;
    }
    public Date getDate() {
        return date;
    }
    public JSONArray getTimes() {
        return times;
    }
    public String dateToString() {
        return fdate.format(getDate());
    }
}
Answer 1

Я думаю распарсить такой Json не проблема, поэтому будем считать, что данные в строковом виде есть.

Каждую дату парсим с помощью SimpleDateFormat("yyyy-MM-dd") в объект Date. Время парсим так, как требуется по заданию.

Загоняем пары дата-время в List из структур, типа:

class MyDate {
    Date date;
    Time time; //Здесь тип `Time` - псевдотип. Реальный тип поля зависит от того, как Вы парсите время
}

Далее, как вариант, используем метод Collections.sort(List, Comparator). Где List - это наша коллекция, а Comparator - это реализация соответствующего интерфейса, в методе compareTo которого всего одна строка: return date1.compareTo(date2).

После этого список наших структур MyDate отсортирован по возрастанию Date.

READ ALSO
Фактическая роль репозитория в Clean Architecture

Фактическая роль репозитория в Clean Architecture

Задался вопросом: а кем выступает репозиторий для Domain слояПравильно ли я понимаю, что репозиторий — просто мост, между логикой и системно-зависимой...

389
Именование методов доступа к данным в Clean Architecture

Именование методов доступа к данным в Clean Architecture

Можно ли мыслить в терминологии конкретного источника данных (например, базы данных) в Presentation (Presenter) и Domain (Interactor) слоях? Для примера: может...

353
Структура пакетов в Clean Architecture

Структура пакетов в Clean Architecture

Как правильно раскладывать пакеты в проекте, если используется "Чистая архитектура"? Есть ли какие-то нормальные проекты-примеры реализации...

354
Русские символы regex в java

Русские символы regex в java

Почему получаются разные результаты следующих методов?

350