1
votes

Quelle est la structure de données optimale pour stocker une grille de chaînes dans Kotlin?

Quelle est la structure de données optimale pour stocker une grille de chaîne comme celle-ci et comment convertir de manière concise la chaîne en ce type de données?

"" "10 15 20 11 14 19 04 10 18 63 92 68 "" "

Je souhaite accéder facilement à n'importe quel nombre de la grille en utilisant une paire de coordonnées.


0 commentaires

3 Réponses :


2
votes

Vous pouvez utiliser la list de des listes comme celle-ci:

val grid = """10 15 20 11
              14 19 04 10
              18 63 92 68""".asGrid(4)

Vous pouvez également écrire votre propre extension fonction et utilisez-la avec des paires :

fun String.asGrid(size: Int): List<List<String>> = split(" ", "\n").chunked(size)

Mise à jour

Vous pouvez créer une liste de listes à partir d'une chaîne avec cette fonction d'extension d'assistance:

fun List<List<String>>.get(i: Pair<Int, Int>) = this[i.first][i.second]
val element = grid.get(1 to 1)

Dans ce cas, nous divisez notre chaîne pour séparer les nombres et obtenir une collection de chaînes List . Et après cela, nous tronçons cette liste pour obtenir Liste >

Utilisation:

val grid: List<List<String>> = listOf(
    listOf("10", "15", "20"),
    listOf("14", "19", "04"),
    listOf("18", "63", "92")
)

val elem = grid[1][1]


2 commentaires

Merci pour votre réponse. Je voulais juste dire que mon intention était de convertir par programme de la chaîne à votre liste de listes. Parce que je sais que Kotlin peut être très concis, je ne sais tout simplement pas comment j'y arriverais.


Wow, ça marche vraiment. Je ne connaissais pas la fonction split () à arguments multiples et la fonction chunked (). Solution très propre. Merci!



3
votes

Vous pouvez lire chaque ligne sous forme de séquence en utilisant lineSequence et divisent la chaîne en utilisant le "" (séparateur d'espace):

Exemple:

val str =
    """
    10 15 20 11
    14 19 04 10
    18 63 92 68
    """.trimIndent() // remove extra indents.

val list = str.lineSequence()
    .map { it.split(" ") /*.toInt()*/ }  // performs intermediate operation (isn't done yet)
    .toList()  // performs terminal operation (performing map, and then convert to list)

println(list) // prints: [[10, 15, 20, 11], [14, 19, 04, 10], [18, 63, 92, 68]]


1 commentaires

Merci de répondre! Je ne connaissais pas la fonction lineSequence (). Cela semble très utile.



1
votes
grid.split("\n").map { line -> line.split(" ").map { nr -> Integer.parseInt(nr) } }
Here you first split your input into lines (getting you a list of strings), and then you map each of store lists to split them by the space. Then you may parse each of the strings inside, to parse them into an integer. This results in the end into a list of list of integers.You might want to change the exact parsing to support more options (like splitting on all whitespaces) or parse into a different type.

1 commentaires

Merci! La fonction map () semble vraiment utile. J'essayais de résoudre ce problème en utilisant la fonction forEach () mais c'est en fait map () que je cherchais.