Как получить текущий и следующий элемент одновременно из MutableMap с помощью Kotlin?

Я хотел бы хранить такую ​​информацию, как rowid (ключ) и orderId (значение) в MutableMap. Затем выполните итерацию по MutableMap и получите ключ и значение текущего элемента, а также ключ и значение следующего элемента. Причина этого в том, что, когда я перебираю карту, я меняю значение первого элемента, используя значение второго элемента, или я изменяю значение второго значения элемента, используя значение первого элемента.

Пример:

    val mutableMap: MutableMap<Int, Int> = mutableMapOf<Int, Int>()
    mutableMap[350] = 0
    mutableMap[351] = 1
    mutableMap[352] = 2
    mutableMap[353] = 3
    mutableMap.put(354, 4)
    mutableMap.put(355, 5)
    mutableMap.put(356, 6)

    for (key in mutableMap.keys) {
        Log.d("print data", "print data, Key = ${key}, Value = ${mutableMap[key]}")
    }

Как получить этот предмет: myLinkedHashMap[450] = 0 и этот элемент myLinkedHashMap[453] = 3 информации одновременно, поэтому я могу поменять местами значения между ними?

Map.keys установлены, значит не заказаны. Какой следующий пункт в этом случае для вас? stackoverflow.com/a/44595686/5479247

Eugene Krivenja 25.10.2022 13:07

Какую коллекцию я должен использовать для достижения своей цели и как?

DevPeter 25.10.2022 13:18

Думаю, вам подойдет SortedMap: kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/…

Eugene Krivenja 25.10.2022 13:21

@EugeneKrivenja mutableMapOf гарантированно будет заказан на основании его документов. В настоящее время он возвращает LinkedHashMap.

Tenfour04 25.10.2022 14:29
0
4
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя интерфейсы Map и MutableMap не претендуют на упорядоченность, конкретная реализация, используемая mutableMapOf, все равно упорядочена. Это гарантировано, потому что это объявлено в документации функции. Поэтому, если вы работаете с MutableMap, который вы объявили локально с помощью mutableMapOf, то вы знаете, что он упорядочен. Если вы работаете с MutableMap, который был передан вам из какого-то другого класса, вы не можете быть уверены, что он упорядочен. Но это должно быть довольно редким явлением, поскольку передача изменяемых коллекций между классами является плохой инкапсуляцией.

Чтобы повторить карту, упорядоченную парами, вы можете использовать zipWithNext на клавишах. Этот вызов создает копию списка ключей, поэтому вы можете безопасно изменять карту внутри цикла. Это похоже на движущееся окно пар — каждый элемент, кроме первого и последнего, появится в двух разных парах, один раз как второй элемент, а затем один раз как первый элемент.

for ((keyA, keyB) in mutableMap.keys.zipWithNext()) {
    
}

Если вы хотите повторять эксклюзивные пары, вы можете использовать chunked(2) вместо zipWithNext(), но вам нужно быть уверенным, что вы разбиваете только четное количество элементов:

for ((keyA, keyB) in mutableMap.keys.take(mutableMap.size - mutableMap.size % 2).chunked(2)) {

}

// or

for (keys in mutableMap.keys.chunked(2)) {
    if (keys.size == 1) continue
    val (keyA, keyB) = keys
    
}

Другие вопросы по теме