Hashmap поставить то же значение - PullRequest
0 голосов
/ 11 октября 2019

Я просто хочу спросить, почему мой HashMap вставляет такое же значение, даже если я помещаю его в цикл?

val parentMap = HashMap<String, Any?>()
val map = HashMap<String, Any?>()
orders.forEachIndexed { i, order ->
   map["id"] = order.id
   map["productName"] = order.productName
   map["quantity"] = order.quantity
   Log.i(TAG, "order=$order")
   parentMap["data$i"] = map
   Log.i(TAG, "map=$parentMap") // This parent map contains a same value from map...
}
Log.i(TAG, "map=$parentMap")

Я забыл что-то добавить ?? Любая помощь приветствуется, спасибо.

Ответы [ 4 ]

0 голосов
/ 11 октября 2019

Вы создаете объект Map вне цикла.

val map = HashMap ()

Таким образом, он создаст одну запись карты, где вам нужна другая картадля родительской карты.

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

Решение - сохранить val map = Hashmap () внутри цикла. Таким образом, на каждой итерации будут создаваться разные объекты карты, содержащие разные данные в соответствии с итерациями.

0 голосов
/ 11 октября 2019

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

0 голосов
/ 11 октября 2019

Подводя итог тому, что все здесь сказали.

В java и kotlin все объекты, хранящиеся в куче, и все ваши переменные хранят только ссылки на объекты в куче:

Когда вы делаете это: parentMap["data$i"] = map

Ваши ключи, например: data1, data2, data3 ... будут указывать на экземпляр той же карты, которую вы создали здесь:val map = HashMap<String, Any?>().

Так что все, что вы делаете с вашей картой:

   map["id"] = order.id
   map["productName"] = order.productName
   map["quantity"] = order.quantity

меняйте только одну карту, которая у вас есть.

Чтобы исправить это, вы можете поместить свою картусоздание внутри цикла. Или я предлагаю вам использовать неизменный стиль как:

orders.mapIndexed { i, order ->
    "data$i" to mapOf(
        "id" to order.id,
        "productName" to order.productName,
        "quantity" to order.quantity
    )
}.toMap()
0 голосов
/ 11 октября 2019

Итак, что вы здесь делаете, это назначаете объект карты вашей родительской карте. Родительская карта хранит объект карты целиком, а не данные. Вам нужно будет создавать новый объект 'map' на каждой итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...