Как я могу разделить массив?

#java

#java

Вопрос:

У меня есть блок кода, подобный приведенному ниже. Что касается условия else, я хочу добавить то, что я добавляю в totalDates массив, как если бы это был единый массив.

 public ResponseEntity<?> findByHourlyAggregated(@PathVariable String hours) {

    HashMap<Date, List<Post>> map = new HashMap<Date, List<Post>>();
    Date startDate = new Date();
    Date date = new Date();
    Timestamp endDate = null;
    Date endDate = new Date();
    List<Post> postAll = (List<Post>) findAll();
    Instant afterHours = null;
    List<Post> totalDates = new ArrayList<>();
    List<Date> allDates = new ArrayList<Date>();
    Date firstDate;
    firstDate = postAll.get(0).getDateCreated();
    for (Post p : postAll) {      
        startDate = p.getDateCreated(); //2020-08-11 10:42:08.0 , time of incoming data
        date = new Date(firstDate.getTime()   TimeUnit.HOURS.toMillis(Integer.parseInt(hours))); // Tue Aug 11 12:42:08 EET 2020 
        endDate = new Timestamp(date.getTime()); // 2020-08-11 12:42:08.0, add the parameter entered with the incoming data
        
        if (firstDate.getTime() <= endDate.getTime() amp;amp; startDate.getTime() <= endDate.getTime()) {
            totalDates.add(p);
            
        }
        else {
            map.put(firstDate, totalDates);
            firstDate.setTime(endDate.getTime()); // value of new values when values in range are exhausted
            date = new Date(firstDate.getTime()   TimeUnit.HOURS.toMillis(Integer.parseInt(hours))); // Adds 2 hours
            endDate = new Timestamp(date.getTime());
        }
    }
    return new ResponseEntity<>(map, HttpStatus.OK);
}
  

Я отделяю значение даты от данных Post в соответствии со значением параметра. Например, когда вводится значение 2, мне нужно присвоить значения от 10-12 одному массиву и значения от 12-14 другому массиву. В результате я хочу получить распечатку.

 {
    "2020-08-11T10:42:08.000 03:00": [
        {
            "id": 1,
            "postBody": "Post 1",
            "author": "michael",
            "dateCreated": "2020-08-11T10:42:08.000 03:00"
        },
        {
            "id": 2,
            "postBody": "Post 2",
            "author": "jam",
            "dateCreated": "2020-08-11T10:45:21.000 03:00"
        },
        {
            "id": 3,
            "postBody": "Post 3",
            "author": "jim",
            "dateCreated": "2020-08-11T10:57:33.000 03:00"
        },
        {
            "id": 4,
            "postBody": "Post 4",
            "author": "dwight",
            "dateCreated": "2020-08-11T11:02:35.000 03:00"
        },
        {
            "id": 5,
            "postBody": "Post 5",
            "author": "scott",
            "dateCreated": "2020-08-11T11:52:51.000 03:00"
        }
    ]
}

2020-08-12T12:42:08.000 03:00": [
            {
                ...
            },
            {
                ...
            }], 

            ....
  

Комментарии:

1. Не могли бы вы, пожалуйста, внести больше ясности в свой вопрос?

2. в чем вопрос? Ваш список totalDates не разделен. Это то, о чем вы спрашиваете?

3. Да, я хочу разделить его как первый индекс, когда я ввожу условие else, а затем как второй индекс, когда вы вводите его снова.

Ответ №1:

Я думаю, вам следует инициализировать totalDates после инструкции map.put в блоке else. Тогда записи будут разделены на разные объекты списка totalDates.

 map.put(firstDate, totalDates);
totalDates = new ArrayList<>(); // This will create a new ArrayList instance
  

Обновление 1

Рассмотрите возможность изменения вашей хэш-карты

 HashMap<Date, List<Post>> map = new HashMap<Date, List<Post>>();
  

Для

 HashMap<String, List<Post>> map = new HashMap<String, List<Post>>();
  

Ключи на карте должны быть неизменяемыми. Использование String в качестве ключа обеспечит это. Затем вы можете изменить логику put на —

 map.put(firstDate.toString(), totalDates);
  

Надеюсь, это поможет.

Комментарии:

1. Вы имеете в виду часть totalDates.add(p)? Не могли бы вы, пожалуйста, написать короткий код?

2. Спасибо. Это работает. Я сохраняю данные первой даты в firstDate data. Я заменяю firstDate на LastDate всякий раз, когда он входит в блок else. Но последние измененные данные firstDate записываются в карту. Например, я хочу; { «2020-08-11_10»: [… Сообщения, созданные между 10-12 часами августа 11 …], «2020-08-11_12»: [… Сообщения, созданные между 12-14 часами 11 августа …], … }, должны быть в форме

3. @MichaelScott Извините, я не совсем понял вопрос. Вам нужен формат ключа карты как 2020-08-11_10 вместо 2020-08-11T10:42:08.000 03:00? Кроме того, не могли бы вы, пожалуйста, поддержать ответ. Я не мог понять, почему это было отклонено.

4. Я не голосовал против. Это выдает ошибку, когда я пытаюсь проголосовать за. Прошу прощения за это.

5. В ключевом разделе карты есть данные firstDate. Я имею в виду это; Для данных между 10-12 часами «2020-08-11T10: 42: 08.000 03: 00»: [{}], ( данные между 10-12 часами) «2020-08-11T12: 42: 08.000 03: 00»: [{}], ( данные между 12-14 часами) «2020-08-11T14: 42: 08.000 03: 00»: [{}], ( данные между 14-16 часами) … Но firstDate — это последнее значение firstDate для всех данных. «2020-08-12T02: 42: 08.000 03: 00»: [{}], «2020-08- 12T02: 42: 08.000 03: 00»: [{}], «2020-08- 12T02: 42: 08.000 03: 00»: [{}], …