TreeMap foreach не меняет значение объекта

Итак, у меня есть TreeMap<Integer, Transmitter> и через foreach я пытаюсь изменить внутренний атрибут передатчика, но мне кажется, что он делает копию объекта в TreeMap, поскольку он не меняет значение в TreeMap.

Мой код foreach:

        for (TreeMap<Integer, Transmitter> current : transmitterDiagnosticMap.values()) {
            for (Transmitter t : current.values()) {
                String transmitterError = t.printErrorReport(date, appContext);
                if (transmitterError != null)
                    stringsErrorsAndWarnings.add(transmitterError);
            }
        }

Мой код printErrorReport:

     public String printErrorReport(String data, Context context) {
        String output = null;
        if (this.writeOnReport()) { // This is the function that will modify the object
            output = data + " - " + this.getTension();
        }
        return output;
    }
    // This is the method that tells whether or not the report will be written, and changes the variable lastStatus if necessary
    private boolean writeOnReport() {
        if (this.status > 0) {
            if (this.lastStatus == 0 || this.lastStatus != this.status) {
                this.lastStatus = this.status;
                return true;
            }
            return false;
        } else {
            this.lastStatus = 0;
            return false;
        }
    }

Что я мог заметить, так это то, что Transmitter t на самом деле меняет значение с lastStatus = 0 в lastStatus = 1, но ничего не изменилось в TreeMap.

1 ответ

Решение

Вы должны использовать итератор для изменения значений в TreeMap. С помощью current.values() создаст копию вместо того, чтобы мутировать объект.

Вам нужно перебрать ключи TreeMap и обновить значения.

for (TreeMap<Integer, Transmitter> current : transmitterDiagnosticMap.values()) {
    for (Map.Entry<Integer, Transmitter> entry : current.entrySet()) {
        Transmitter t = entry.getValue();
        String transmitterError = t.printErrorReport(date, appContext);
        if (transmitterError != null)
            stringsErrorsAndWarnings.add(transmitterError);
        entry.setValue(t);
    }
}
Другие вопросы по тегам