Katakanlah saya memiliki peta: Map<Int, String> dan saya tahu bagaimana peta ini dibuat dan mempertahankan urutan iterasi. Bagaimana saya bisa mengulangi semua elemen dalam rentang tertentu?

val map: Map<Int, String> = mapOf(
    1 to "one", 
    2 to "two", 
    3 to "three", 
    4 to "four")

// Let's say I want to get all values after key 3.

val iterator = map.iterator()
while (iterator.next().key != 3) {}
val itemsAfter3 = iterator.asSequence().map { it.value }

Selain jelek, itu adalah O(n). Apakah ada cara yang lebih baik, lebih elegan dan efisien?

Saya berpikir untuk melakukan sesuatu dengan map.keys.indexOf(), tetapi tampaknya di sini kerumitannya juga linier.

-1
Martin Drozdik 12 Mei 2021, 13:21

1 menjawab

Jawaban Terbaik

Jangan pernah mengandalkan implementasi internal, itu mungkin berubah di masa depan. Jika Anda memerlukan urutan penyisipan melestarikan peta selama iterasi, nyatakan secara eksplisit:

val map: Map<Int, String> = linkedMapOf(
    1 to "one",
    2 to "two",
    3 to "three",
    4 to "four"
)

Mendapatkan semua nilai setelah indeks tertentu semudah:

val valuesAfterIndex3 = map.values.drop(3)
2
Михаил Нафталь 12 Mei 2021, 10:32