Comment initialiser un tableau dans Kotlin avec des valeurs?

261

En Java, un tableau peut être initialisé tel que:

int numbers[] = new int[] {10, 20, 30, 40, 50}

À quoi ressemble l'initialisation du tableau de Kotlin?

Lars Blumberg
la source
Peut-être jetez un coup d'œil aux documents: kotlinlang.org/docs/reference/basic-types.html
khlr
6
La documentation cache quelque peu la réponse. Au lieu de donner un exemple de code source, ils mentionnent la fonction (obsolète) array()dans un commentaire latéral: Pour créer un tableau, nous pouvons utiliser un tableau de fonctions de bibliothèque () et lui transmettre les valeurs des éléments, de sorte que le tableau (1, 2, 3 ) crée un tableau [1, 2, 3].
Lars Blumberg
8
Bien que j'aime Kotlin mais j'ai dit que la "documentation Kotlin" n'est pas assez bonne (j'ai appris plus sur d'autres sites que kotlinlang.org).
Hassan Tareq
1
Parfois aussi, vous voulez juste un intRange que vous pourriez faire: val numbers = 1..5ce qui donne une plage d'int 1 à 5.
Sylhare

Réponses:

313
val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50)

Voir Kotlin - Types de base pour plus de détails.

Vous pouvez également fournir une fonction d'initialisation comme deuxième paramètre:

val numbers = IntArray(5) { 10 * (it + 1) }
// [10, 20, 30, 40, 50]
Maroun
la source
9
Est-il préférable d'utiliser intArrayOfplus arrayOf? A donc IntArraydes avantages sur Array<Int>?
Lars Blumberg
17
@LarsBlumberg IntArray est égal à int [], Array <Int> est identique à Integer []
user2235698
3
L'initialisation d'une liste est très similaire:listOf(10, 20, 30, 40, 50)
Cristan
Lorsque j'utilise la fonction intArrayOf (), je fais face Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackage. J'utilise jdk1.8.0_241et Intellij IDEA
TeachMeJava
92

À noter que lors de l' utilisation builtines de Kotlin (par exemple intArrayOf(), longArrayOf(), arrayOf(), etc.) , vous n'êtes pas en mesure d'initialiser le tableau avec des valeurs par défaut (ou toutes les valeurs à la valeur désirée) pour une taille donnée, au lieu que vous devez faire initialize par appel selon constructeur de la classe .

// Array of integers of a size of N
val arr = IntArray(N)

// Array of integers of a size of N initialized with a default value of 2
val arr = IntArray(N) { i -> 2 }
vtor
la source
9
Cette deuxième valeur par défaut init utilisant le lambda était super utile! Merci
rf43
9
La deuxième forme d'initialisation peut s'écrire: IntArray(N) {i -> 2}et même (lors de l'initialisation avec une constante)IntArray(N) {2}
David Soroko
1
Au lieu de i, nous pouvons utiliser "_" var arr = IntArray (N) {_ -> false}
Navas pk
1
Celui avec le lambda était exactement ce dont j'avais besoin pour initier un tableau avec une taille dynamique et une valeur par défaut non facultative. Merci!
mithunc
48

Voici un exemple:

fun main(args: Array<String>) {
    val arr = arrayOf(1, 2, 3);
    for (item in arr) {
        println(item);
    }
}

Vous pouvez également utiliser une aire de jeux pour tester les fonctionnalités du langage.

ombre
la source
3
Un commentaire, pour imprimer la valeur d'un tableau, nous pouvons utiliser array.joinToString ("") à la place en boucle.
anticafe
2
Fonctionne mais semble plus Java écrit en Kotlin que Kotlin idiomatique :)
m0skit0
47

À Kotlin, il existe plusieurs façons.

var arr = IntArray(size) // construct with only size

Il suffit ensuite de donner une valeur initiale aux utilisateurs ou à une autre collection ou où vous le souhaitez.

var arr = IntArray(size){0}  // construct with size and fill array with 0
var arr = IntArray(size){it} // construct with size and fill with its index

Nous pouvons également créer un tableau avec des fonctions intégrées comme

var arr = intArrayOf(1, 2, 3, 4, 5) // create an array with 5 values

Autrement

var arr = Array(size){0} // it will create an integer array
var arr = Array<String>(size){"$it"} // this will create array with "0", "1", "2" and so on.

Vous pouvez également utiliser doubleArrayOf()ou DoubleArray()ou n'importe quel type primitif au lieu de Int.

HM Nayem
la source
var arr = IntArray(size, { it * 1 } )est le même quevar arr = IntArray(size){it}
Dét
30

En Kotlin nous pouvons créer une matrice en utilisant arrayOf(), intArrayOf(), charArrayOf(), booleanArrayOf(), longArrayOf()fonctions.

Par exemple:

var Arr1 = arrayOf(1,10,4,6,15)  
var Arr2 = arrayOf<Int>(1,10,4,6,15)  
var Arr3 = arrayOf<String>("Surat","Mumbai","Rajkot")  
var Arr4 = arrayOf(1,10,4, "Ajay","Prakesh")  
var Arr5: IntArray = intArrayOf(5,10,15,20)  
RS Patel
la source
Veuillez reformater cette réponse pour qu'il soit clair ce qu'est le code et ce qui est un commentaire.
6

Ancienne question, mais si vous souhaitez utiliser une plage:

var numbers: IntArray = IntRange(10, 50).step(10).toList().toIntArray()

Donne presque le même résultat que:

var numbers = Array(5, { i -> i*10 + 10 })

résultat: 10, 20, 30, 40, 50

Je pense que la première option est un peu plus lisible. Les deux fonctionnent.

Brooks DuBois
la source
5

vous pouvez utiliser ces méthodes

var numbers=Array<Int>(size,init)
var numbers=IntArray(size,init)
var numbers= intArrayOf(1,2,3)

exemple

var numbers = Array<Int>(5, { i -> 0 })

init représente la valeur par défaut (initialiser)

Ali hasan
la source
1
Cela aide si vous donnez des exemples pour initin Array<Int>()et IntArray(), votre réponse n'est pas très utile pour l'instant.
Lars Blumberg
La réponse a été modifiée
Ali hasan
Array <Int> vous donne un tableau d'entiers encadrés, tandis que IntArray vous donne un tableau int réel.
Mike
4

Langue Kotlin a des classes spécialisées pour représenter les tableaux de types primitifs sans boxe frais généraux: par exemple - IntArray, ShortArray, ByteArray, etc. Je besoin de dire que ces classes ont aucune relation d'héritage à la société mère Arrayclasse, mais ils ont le même ensemble de méthodes et propriétés. Chacun d'eux a également une fonction d'usine correspondante. Donc, pour initialiser un tableau avec des valeurs dans Kotlin, il vous suffit de taper ceci:

val myArr: IntArray = intArrayOf(10, 20, 30, 40, 50)

... ou de cette façon:

val myArr = Array<Int>(5, { i -> ((i+1) * 10) })

myArr.forEach { println(it) }                                // 10, 20, 30, 40, 50

Vous pouvez maintenant l'utiliser:

myArr[0] = (myArr[1] + myArr[2]) - myArr[3]

J'espère que cela t'aides.

Andy
la source
3

Je pense qu'une chose qui mérite d'être mentionnée et qui n'est pas suffisamment intuitive dans la documentation est que, lorsque vous utilisez une fonction d'usine pour créer un tableau et que vous spécifiez sa taille, le tableau est initialisé avec des valeurs égales à leurs valeurs d'index. Par exemple, dans un tableau comme celui - ci: val array = Array(5, { i -> i })les valeurs initiales sont attribuées [0,1,2,3,4]et ne pas dire, [0,0,0,0,0]. C'est pourquoi à partir de la documentation, val asc = Array(5, { i -> (i * i).toString() })produit une réponse de["0", "1", "4", "9", "16"]

Alf Moh
la source
3

Vous pouvez créer un tableau Int comme ceci:

val numbers = IntArray(5, { 10 * (it + 1) })

5 est la taille Int Array. la fonction lambda est la fonction init de l'élément. gamme 'it' dans [0,4], plus 1 gamme make dans [1,5]

la fonction d'origine est:

 /**
 * An array of ints. When targeting the JVM, instances of this class are 
 * represented as `int[]`.
 * @constructor Creates a new array of the specified [size], with all elements 
 *  initialized to zero.
 */
 public class IntArray(size: Int) {
       /**
        * Creates a new array of the specified [size], where each element is 
        * calculated by calling the specified
        * [init] function. The [init] function returns an array element given 
        * its index.
        */
      public inline constructor(size: Int, init: (Int) -> Int)
  ...
 }

Classe IntArray définie dans Arrays.kt

zyc zyc
la source
2

Vous pouvez essayer ceci:

var a = Array<Int>(5){0}
kulst
la source
2

Vous pouvez simplement utiliser les méthodes de bibliothèque standard existantes , comme indiqué ici:

val numbers = intArrayOf(10, 20, 30, 40, 50)

Il peut être judicieux d'utiliser un constructeur spécial:

val numbers2 = IntArray(5) { (it + 1) * 10 }

Vous passez une taille et un lambda qui décrivent comment initier les valeurs. Voici la documentation:

/**
 * Creates a new array of the specified [size], where each element is calculated by calling the specified
 * [init] function. The [init] function returns an array element given its index.
 */
public inline constructor(size: Int, init: (Int) -> Int)
s1m0nw1
la source
2

Je me demande pourquoi personne n'a donné la réponse la plus simple:

val array: Array<Int> = [1, 2, 3]

Selon l'un des commentaires de ma réponse d'origine, j'ai réalisé que cela ne fonctionne que lorsqu'il est utilisé dans les arguments d'annotations (ce qui était vraiment inattendu pour moi).

On dirait que Kotlin ne permet pas de créer des littéraux de tableau en dehors des annotations.

Par exemple, regardez ce code en utilisant @Option de la bibliothèque args4j:

    @Option(
        nom = "-h",
        alias = ["--help", "-?"],
        usage = "Afficher cette aide"
    )
    var help: Boolean = false

L'argument d'option "alias" est de type Array<String>

hdkrus
la source
2
J'ai l'erreur suivante avec ce code: non pris en charge [Littéraux de collection en dehors des annotations]
Rémi P
Je n'ai jamais vu ça avant. Cette syntaxe est-elle nouvelle pour Kotlin?
Lars Blumberg
@LarsBlumberg, probablement, je viens de commencer à utiliser Kotlin récemment avec IntelliJ 2019.1 et j'ai initialisé un tableau de chaînes comme je l'ai montré et cela a fonctionné
hdkrus
@ RémiP, Bon point, je l'ai utilisé sur des arguments d'annotations. Mais cela signifierait que les littéraux de tableau fonctionnent dans certains contextes et dans d'autres non?
hdkrus
1
@hdkrus Pourquoi ne mettez-vous pas à jour votre réponse pour montrer comment l'initialisation du tableau fonctionne avec les annotations? Cela peut être utile pour de nombreux lecteurs de ces questions.
Lars Blumberg
1

Dans mon cas, j'ai besoin d'initialiser mes articles de tiroir. Je remplis les données par le code ci-dessous.

    val iconsArr : IntArray = resources.getIntArray(R.array.navigation_drawer_items_icon)
    val names : Array<String> = resources.getStringArray(R.array.navigation_drawer_items_name)


    // Use lambda function to add data in my custom model class i.e. DrawerItem
    val drawerItems = Array<DrawerItem>(iconsArr.size, init = 
                         { index -> DrawerItem(iconsArr[index], names[index])})
    Log.d(LOGGER_TAG, "Number of items in drawer is: "+ drawerItems.size)

Classe de modèle personnalisé

class DrawerItem(var icon: Int, var name: String) {

}
Rahul
la source
Cela ne répond pas vraiment à la question de manière sensée.
Qwerp-Derp
Veuillez vérifier le commentaire dans lequel j'ai utilisé la fonction lambda pour ajouter des éléments.
Rahul
Cela semble toujours être un moyen compliqué de résoudre ce problème, du moins par rapport aux autres réponses. J'ai également regardé mon message précédent, et il semble dur rétrospectivement - je suis désolé.
Qwerp-Derp
C'est bien, pas de problème. J'ai juste essayé de répondre d'une manière qui a résolu mon problème, je n'ai pas comparé avec d'autres réponses. Je vous remercie!
Rahul
1

Déclarer un tableau int au niveau global

var numbers= intArrayOf()

méthode onCreate suivante initialise votre tableau avec une valeur

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    //create your int array here
    numbers= intArrayOf(10,20,30,40,50)
}
Nihal Desai
la source
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant pourquoi et / ou comment ce code répond à la question améliore sa valeur à long terme.
rollstuhlfahrer
1

En Java, un tableau peut être initialisé tel que:

int numbers[] = new int[] {10, 20, 30, 40, 50}

Mais dans Kotlin, un tableau a été initialisé de plusieurs façons, comme:

Tout type générique de tableau que vous pouvez utiliser la fonction arrayOf () :

val arr = arrayOf(10, 20, 30, 40, 50)

val genericArray = arrayOf(10, "Stack", 30.00, 40, "Fifty")

En utilisant les fonctions utilitaires de Kotlin, un tableau peut être initialisé

val intArray = intArrayOf(10, 20, 30, 40, 50)
Samad Talukder
la source
1

Manière simple:

Pour Integer:

nombre var = arrayOf <Int> (10, 20, 30, 40, 50)

Conserver tous les types de données

nombre var = arrayOf (10, "valeur de chaîne", 10,5)

Zafar Iqbal
la source
0

intialiser le tableau de cette manière: val paramValueList : Array<String?> = arrayOfNulls<String>(5)

Abhilash Das
la source
0

De cette façon, vous pouvez initialiser le tableau int en koltin.

 val values: IntArray = intArrayOf(1, 2, 3, 4, 5,6,7)
Nikhil Katekhaye
la source
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
leopal
0

Ma réponse complète @maroun voici quelques façons d'initialiser un tableau:

Utilisez un tableau

val numbers = arrayOf(1,2,3,4,5)

Utilisez un tableau strict

val numbers = intArrayOf(1,2,3,4,5)

Mélanger les types de matrices

val numbers = arrayOf(1,2,3.0,4f)

Tableaux d'imbrication

val numbersInitials = intArrayOf(1,2,3,4,5)
val numbers = arrayOf(numbersInitials, arrayOf(6,7,8,9,10))

Possibilité de commencer avec du code dynamique

val numbers = Array(5){ it*2}
Fahed Hermoza
la source