1
votes

Accès aux éléments sortants d'un tableau dans Kotlin

La plupart de la logique que j'utilise pour travailler sur des tableaux en JavaScript dépend de ma capacité à jouer avec les index. Je suis en train de faire la transition vers kotlin, donc j'ai constaté qu'une partie de la logique que j'utilise ne convient pas à kotlin.

Quelque chose d'aussi simple que d'initialiser un tableau puis d'accéder à un index non défini semble être plus compliqué que ce que je suis utilisé à.

Je comprends qu'il y a plusieurs façons d'ajouter à des listes sur kotlin et d'accéder à des tableaux et des trucs. Mais ce que je veux savoir, c'est de quelles options ai-je pour créer des tableaux avec une taille non fixe, puis ajouter des éléments au tableau dans un ordre sans distinction. Je viens de participer au boot camp udacity kotlin la semaine dernière, mais j'ai rencontré des problèmes lors de l'utilisation des index comme je l'ai utilisé en javascript.

// JavaScript Code
var W = Array();
W[0] = 1
//Kotlin 
var W = arrayOf()
W[0] =1

Exception IndexOutofbounds


0 commentaires

3 Réponses :


0
votes

si vous voulez vous arrayOf (), vous devez init. essayez ceci,

val arr1 = arrayOf(1,2,3)
val arr2 = arrayOfNulls<Int>(5)

Aussi si un élément de tableau peut avoir une valeur nulle ou si le type de l'élément autorise des valeurs nulles, alors la fonction arrayOfNulls () doit être utilisée. p >

val arr = arrayOf(1,2,3)
//arr[0] = 1
//arr[1] = 2
//arr[2] = 3


4 commentaires

Merci pour la réponse @S T Le problème que j'ai surtout est que je dépend du tableau qui me laisse sortir des limites, c'est donc mon principal intérêt. Si je pouvais vraiment m'aider à traduire mon code (de JavaScript à Kotlin) de la manière la plus directe possible. Par exemple: function str2binb (str) {var bin = Array (); var mask = (1 << chrsz) - 1; pour (var i = 0; i > 5] | = (str.charCodeAt (i / chrsz) & mask) << (24 - i% 32) ; bac de retour; } Sortir des limites est intégré dans la logique du code, comme on l'attend de javascrip.


function str2binb (str) {var bin = Array (); var mask = (1 << chrsz) - 1; pour (var i = 0; i > 5] | = (str.charCodeAt (i / chrsz) & mask) << (24 - i% 32) ; bac de retour; }


Je pense que vous pouvez simplement utiliser l'assistant arrayOfNulls pour pré-dimensionner votre tableau à la bonne taille.


Notez qu'un Array ne peut pas être redimensionné (contrairement à une MutableList ): stackoverflow.com/questions/36262305/...



1
votes

Si vous souhaitez convertir une chaîne en un tableau d'octets, Kotlin Std Lib inclut déjà un extension amusante pour ça

fun String.toByteArray(
    charset: Charset = Charsets.UTF_8
): ByteArray

// Example from Kotlin Docs
val charset = Charsets.UTF_8
val byteArray = "Hello".toByteArray(charset)
println(byteArray.contentToString()) // [72, 101, 108, 108, 111]
println(byteArray.toString(charset)) // Hello


0 commentaires

1
votes

Dans Kotlin, les Array ont une taille fixe, contrairement aux List qui peuvent croître et se réduire à mesure que des éléments sont ajoutés ou supprimés.

Si vous souhaitez utiliser une List (en particulier, une MutableList ), vous pouvez commencer par une liste vide, puis y ajouter des éléments si nécessaire, par exemple:

val a = Array(10){ it * 2 + 1 }

Ou vous pouvez utiliser un Array , créé avec la taille appropriée, par exemple:

val newList = (0..9).map{ it * 2 + 1 }

Cependant, cet idiome procédural de créer d'abord une structure, puis l'itérer pour la remplir n'est pas autant nécessaire dans Kotlin, car il existe souvent des moyens fonctionnels de créer la structure et de l'initialiser en une seule fois.

Si vous créez une liste à partir de quelque chose que vous pouvez itérer (par exemple une plage, une autre liste, un tableau, une chaîne, ou autre), alors vous pouvez utiliser map():

val a = Array(10){ 0 }
a[0] = 1

Ou vous pouvez spécifier (comment calculer) les valeurs du tableau lorsque vous le créez:

val l = mutableListOf<Int>()
l += 1

(Il existe également de nombreuses possibilités plus sophistiquées!)

Ce style est souvent plus facile à lire et à maintenir, car il se concentre davantage sur ce que vous essayez de faire que sur comment vous le faites.


0 commentaires