Перезаписывается значение Hashmap

#java #elasticsearch #hashmap

#java #elasticsearch #hashmap

Вопрос:

У меня есть Hashmap как таковая глобальная переменная в моем классе:

 private Map<String, CodaReportDTO> dateAndDTO = new TreeMap<>(); //hashmap for date and the dto
 

Итак, значение здесь имеет DTO свойства, которые я должен был заполнить в Excel. Я пытаюсь заполнить только одно поле (которое является numOfTxn из DTO), используя ключ (дату). Итак, в основном я пытаюсь распечатать значения DTO за день.

Это мой класс DTO.

Я пытаюсь добавить значения здесь hashmap как таковые для количества дней в месяце:

 private JSONObject postDataToElasticSearchForSuccessCount(String url, String operatorID) throws IOException, JSONException, ParseException {

    /*JSONObject jsonObject = elasticSearchDataReceiver.getResults(url);

    //getting the number of hits
    JSONObject totalHits = jsonObject.getJSONObject("hits");
    Object hitsCountForSuccessCount = totalHits.get("total");
    String hitCountForSuccessCount = hitsCountForSuccessCount.toString();

    if (Integer.parseInt(hitCountForSuccessCount) > 0) {
        codaReportDTO.setNumOfTxn(Integer.parseInt(hitCountForSuccessCount));
    }
    return new JSONObject(jsonObject.toString());*/

    JSONObject updatedJsonObject = null;
    String jsonBody;
    String monthName = Month.of(Integer.parseInt(excelMonth)).name();
    int numberOfDaysInAMonth = Utilities.getNumberOfDaysForMonth(Integer.parseInt(excelYear), monthName);

    //iterate over the month
    for (int i = 1; i < numberOfDaysInAMonth; i  ) {


        String day = appendZeroToDay(i);
        excelDateMonth = day   "-"   excelMonth;
        Date excelMonthOriginal = new SimpleDateFormat("dd-MM").parse(excelDateMonth);
        String formattedDate = String.valueOf(excelMonthOriginal);
        String MonthOnly = formattedDate.substring(4, 7);
        String DateOnly = formattedDate.substring(8, 10);
        String dateAndMonthFinal = DateOnly   "-"   MonthOnly;
        excelDateMonth = dateAndMonthFinal;

        String input = "{  n"  
                "   "query":{  n"  
                "      "query_string":{  n"  
                "         "query":"api:\"smsmessaging\" AND operatorid:"   operatorID   " AND transactionOperationStatus:\"\" AND responsecode:(200 201) AND year:"   excelYear   " AND month:"   excelMonth   " AND day:"   day   ""n"  
                "      }n"  
                "   },n"  
                "   "aggs":{  n"  
                "      "total":{  n"  
                "         "terms":{  n"  
                "            "field":"userid"n"  
                "         },n"  
                "         "aggs":{  n"  
                "            "grades_count":{  n"  
                "               "value_count":{  n"  
                "                  "script":"doc['userid'].value"n"  
                "               }n"  
                "            }n"  
                "         }n"  
                "      }n"  
                "   }n"  
                "}n";

        jsonBody = input;
        JSONObject jsonObject = elasticSearchDataReceiver.getResult(url, jsonBody);

        JSONObject totalHits = jsonObject.getJSONObject("hits");
        Object hitsCountForSuccessCount = totalHits.get("total");
        String hitCountForSuccessCount = hitsCountForSuccessCount.toString();
        int hitCount = Integer.parseInt(hitCountForSuccessCount);

        if (hitCount > 0) {
            updatedJsonObject = jsonObject;
            codaReportDTO.setNumOfTxn(hitCount);
            dateAndDTO.put(dateAndMonthFinal, codaReportDTO);
        }
    }
    return updatedJsonObject;
}
 

Часть добавления хэш-карты находится в нижней части приведенного выше фрагмента:

dateAndDTO.put(dateAndMonthFinal, codaReportDTO);

Ключ и значение правильно указаны в приведенной выше строке. Но когда он пытается обновить значение для нового ключа, он заменяет другие значения ключей, которые имеют значения, на новое значение. Где я ошибаюсь?

Я пытался сделать это целый день после изучения другого вопроса здесь, в SO, но все равно не смог дозвониться. Любая помощь может быть оценена.

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

1. it replaces the other values of the others keys which have values to the new value Я не уверен, что понимаю эту часть. Можете ли вы более подробно объяснить, что именно происходит?

2. Где находится экземпляр codaReportDTO? Может быть, вы используете один экземпляр для всех значений? Это объяснит симптомы

3. @aviad я создал экземпляр глобально внутри самого этого класса: private CodaReportDTO codaReportDTO = new CodaReportDTO();

4. Итак, вы используете один экземпляр DTO, и все значения указывают на него. Каждый раз, когда вы его меняете, очевидно, что изменения будут отражаться на других записях

5. Если вы не хотите, чтобы изменения переопределялись, вам необходимо создать новый экземпляр DTO для каждого нового ключа

Ответ №1:

Вы используете один и тот же экземпляр вашего DTO для всех записей карты. Вот почему каждое изменение отражается на всех значениях. Если вы не хотите, чтобы изменения переопределялись, вам необходимо создать новый экземпляр для каждого из ключей карты.

Ответ №2:

Существует проблема в том, как используются карты. Если вы хотите использовать несколько значений для одного и того же ключа, вам следует использовать List<> в качестве второго параметра для Map<String, List<CodaReportDTO>>