2016-10-15 4 views
1
überschrieben

ich meine Hashmap als wie eine globale Variable, die innerhalb meiner Klasse:HashMap Wert immer

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

Also hier der Wert ein DTO ist, die Eigenschaften hat, die ich in einer Excel füllen musste. Ich versuche, nur ein Feld (das ist numOfTxn aus dem DTO) mit dem Schlüssel (das Datum) zu füllen. Also im Grunde versuche ich, die Werte der DTO pro Tag auszudrucken.

Dies ist meine DTO class.

Ich versuche Werte hier auf die hashmap als solche für die Anzahl der Tage in einem Monat hinzuzufügen:

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; 
} 

Der hashmap Teil an der Unterseite des obigen Schnipsel Zugabe ist:

DatumAndDTO.put (dateAndMonthFinal, codaReportDTO);

Der Schlüssel und der Wert kommen korrekt in der obigen Zeile. Wenn es jedoch versucht, den Wert für den neuen Schlüssel zu aktualisieren, ersetzt es die anderen Werte der Schlüssel, die Werte mit dem neuen Wert haben. Wo gehe ich falsch?

Ich habe dies für den ganzen Tag versucht, nachdem ich hier in der SO in andere Frage ging, aber immer noch nicht durchkommen konnte. Jede Hilfe könnte geschätzt werden.

+1

verwenden 'es ersetzt die anderen Werte der anderen Schlüssel, die Werte auf den neuen Wert haben 'Ich bin mir nicht sicher Ich verstehe diesen Teil. Können Sie genauer erklären, was genau passiert? –

+1

Wo ist die Instantiierung von codaReportDTO? Könnte es sein, dass Sie eine Instanz für alle Werte verwenden? Dies erklärt die Symptome – aviad

+0

@aviad Ich habe die Instanziierung global innerhalb dieser Klasse selbst gemacht: 'private CodaReportDTO codaReportDTO = new CodaReportDTO();' – Kulasangar

Antwort

1

Sie verwenden dieselbe Instanz Ihres DTO für alle Karteneinträge. Deshalb spiegelt sich jede Änderung in allen Werten wider. Wenn Änderungen nicht überschrieben werden sollen, müssen Sie für jeden Schlüssel der Map eine neue Instanz erstellen.

0

Es gibt ein Problem bei der Verwendung von Karten. Wenn Sie mehrere Werte für denselben Schlüssel verwenden möchten, sollten Sie die Liste <> als zweiten Parameter für Map<String, List<CodaReportDTO>>