値でKotlinの配列を初期化する方法は?


261

Javaでは、次のように配列を初期化できます。

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

Kotlinの配列初期化はどのように見えますか?


多分ちょうどドキュメントを見てください:kotlinlang.org/docs/reference/basic-types.html
khlr

6
ドキュメントは答えをいくらか隠しています。ソースコードの例を提供する代わりarray()に、サイドコメントで(非推奨)関数について言及しています
Lars Blumberg 2015

8
Kotlinは好きですが、「Kotlinのドキュメント」では不十分です(kotlinlang.org以外のサイトから多くを学びました)。
Hassan Tareq 2017年

1
また、あなたができるintRangeが欲しいときもあります:val numbers = 1..5これは1から5までのint範囲を与えます
Sylhare

回答:


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

詳細については、Kotlin-基本タイプをご覧ください。

イニシャライザ関数を2番目のパラメータとして提供することもできます。

val numbers = IntArray(5) { 10 * (it + 1) }
// [10, 20, 30, 40, 50]

9
intArrayOf以上使用するのが望ましいarrayOfですか?したがってIntArray、利点はありArray<Int>ますか?
Lars Blumberg、2015

17
@LarsBlumberg IntArrayはint []に等しく、Array <Int>はInteger []と同じ
user2235698

3
リストを初期化すると非常に似ています:listOf(10, 20, 30, 40, 50)
Cristan

intArrayOf()関数を使用しているとき、に直面しException in thread "main" java.lang.NoClassDefFoundError: kotlin/KotlinPackageます。jdk1.8.0_241Intellij IDEA を使用しています
TeachMeJava

92

(例えばkotlin builtinesを使用するときにすることを言及する価値がintArrayOf()longArrayOf()arrayOf()クラスのコンストラクタに応じて呼び出しを経由して、あなたは、与えられた大きさのために(所望の値に、またはすべての値)のデフォルト値を持つ配列を初期化することができない、など)、代わりにあなたが初期化を行う必要があります。

// 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 }

9
ラムダを使用する2番目のデフォルト値initは非常に役に立ちました!ありがとう
rf43

9
初期化の2番目の形式は、次のように書くことができます。IntArray(N) {i -> 2}さらに(定数で初期化する場合)IntArray(N) {2}
David Soroko

1
私の代わりに「_」を使用できますvar arr = IntArray(N){_-> false}
Navas pk

1
ラムダのあるものは、動的サイズとオプションではないデフォルト値を使用して配列を初期化するために必要なものでした。ありがとう!
mithunc

48

次に例を示します。

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

遊び場を使用して言語機能をテストすることもできます。


3
コメントの1つとして、配列の値を出力するには、ループの代わりにarray.joinToString( "")を使用できます。
anticafe 2018

2
動作しますが、慣用的なKotlinよりもKotlinで書かれたJavaに見えます:)
m0skit0 2018年

47

コトリンにはいくつかの方法があります。

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

次に、ユーザー、別のコレクション、または必要な場所の初期値を入力します。

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

次のような組み込み関数で配列を作成することもできます

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

別の方法

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.

Intの代わりにdoubleArrayOf()またはDoubleArray()または任意のプリミティブ型を使用することもできます。


var arr = IntArray(size, { it * 1 } ) と同じです var arr = IntArray(size){it}
Det

30

Kotlinでは、使用して配列を作成することができarrayOf()intArrayOf()charArrayOf()booleanArrayOf()longArrayOf()機能を。

例えば:

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)  

コードとコメントが明確になるように、この回答を再フォーマットしてください。

6

古い質問ですが、範囲を使用したい場合:

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

以下とほぼ同じ結果が得られます。

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

結果:10、20、30、40、50

最初のオプションはもう少し読みやすいと思います。どちらも機能します。


5

あなたはこの方法を使うことができます

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

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

initはデフォルト値を表します(initialize)


1
initin Array<Int>()との例を挙げればIntArray()、答えが今のところあまり役に立ちません。
Lars Blumberg 2017年

回答が変更されました
アリハサン2017年

Array <Int>はボックス化された整数の配列を提供しますが、IntArrayは実際のint配列を取得します。
マイク

4

Kotlin言語は、オーバーヘッドボクシングせずにプリミティブ型の配列を表現するためのクラスを特化しています。例えば- 、、IntArray これらのクラスは、親への継承関係がないことを言うことなど私の必要性クラスを、彼らはメソッドとプロパティの同じセットを持っています。それぞれに対応するファクトリ関数もあります。したがって、Kotlinで値を使用して配列を初期化するには、次のように入力するだけです。ShortArrayByteArrayArray

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

...またはこの方法:

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

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

今、あなたはそれを使うことができます:

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

お役に立てれば。


3

言及する価値があり、ドキュメントから十分に直観的でないのは、ファクトリ関数を使用して配列を作成し、そのサイズを指定すると、配列はインデックス値と等しい値で初期化されるということです。たとえば、次のような配列では、 val array = Array(5, { i -> i })割り当てられた初期値はで[0,1,2,3,4]あり、とは言いません[0,0,0,0,0]。ドキュメントから、理由があるval asc = Array(5, { i -> (i * i).toString() })の答えを生成します["0", "1", "4", "9", "16"]


3

次のようにInt配列を作成できます。

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

5はInt Arrayサイズです。ラムダ関数は要素のinit関数です。[0,4]の「it」範囲、および[1,5]の1つのmake範囲

原点関数は次のとおりです。

 /**
 * 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)
  ...
 }

Arrays.ktで定義されているIntArrayクラス



2

次に示すように、既存の標準ライブラリメソッドを使用するだけです。

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

ただし、特別なコンストラクタを使用することは理にかなっています。

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

サイズと値を初期化する方法を説明するラムダを渡します。ここにドキュメントがあります:

/**
 * 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)

2

なぜ誰も最も単純な答えを出さなかったのかと思います。

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

私の元の回答へのコメントの1つに従って、これは注釈引数で使用された場合にのみ機能することに気付きました(これは本当に私には予想外でした)。

Kotlinがアノテーションの外で配列リテラルを作成することを許可していないようです。

たとえば、args4jライブラリの@Optionを使用して次のコードを見てください。

    @オプション(
        名前= "-h"、
        エイリアス= ["--help"、 "-?"]、
        使用法=「このヘルプを表示する」
    )
    var help:Boolean = false

オプション引数「エイリアス」はタイプです Array<String>


2
私はこのコードで、次のエラーを持っている:サポートされていない[注釈のコレクションリテラル外]
レミP

私はこれを見たことがありません。この構文はKotlinにとって新しいものですか?
Lars Blumberg

@LarsBlumberg、おそらく、私は最近IntelliJ 2019.1でKotlinを使用し始め、私が示したように文字列配列を初期化し、それが機能しました
hdkrus

@RémiP、良い点、注釈の引数に使用しました。しかし、それは、配列リテラルが一部のコンテキストで機能し、一部のコンテキストで機能しないことを意味しますか?
hdkrus

1
@hdkrus配列の初期化が注釈とともにどのように機能するかを示すために回答を更新してみませんか?これは、この質問の多くの読者にとって価値があります。
Lars Blumberg

1

私の場合、引き出しのアイテムを初期化する必要があります。以下のコードでデータを記入します。

    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)

カスタムモデルクラス

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

}

これは実際には賢明な方法で質問に答えるものではありません。
Qwerp-Derp 2017

ラムダ関数を使ってアイテムを追加したコメントを確認してください。
Rahul

これは、少なくとも他の回答と比較して、この問題を解決する複雑な方法のようです。また、以前のメッセージを確認しましたが、振り返ってみると厳しいようです-すみません。
Qwerp-Derp 2017

それは問題ありません。私は自分の問題を解決する方法で答えようとしただけで、他の答えと比較しませんでした。ありがとうございました!
Rahul

1

グローバルでint配列を宣言

var numbers= intArrayOf()

次のonCreateメソッドは配列を値で初期化します

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)
}

このコードは質問に答えることがありますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
rollstuhlfahrer 2018年

1

Javaでは、次のように配列を初期化できます。

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

しかし、Kotlinでは、配列は次のような多くの方法で初期化されました。

arrayOf() 関数を使用できる任意のジェネリック型の配列:

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

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

Kotlinのユーティリティ関数を使用して配列を初期化できます

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

1

簡単な方法:

整数の場合:

変数番号= arrayOf <Int>(10、20、30、40、50)

すべてのデータ型を保持

var number = arrayOf(10、 "string value"、10.5)



0

このようにして、koltinでint配列を初期化できます。

 val values: IntArray = intArrayOf(1, 2, 3, 4, 5,6,7)

このコードは質問に答えることがありますが、問題を解決する方法や理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
ヒョウ

0

私の答えは@marounを補完するもので、配列を初期化するいくつかの方法があります。

配列を使用する

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

厳密な配列を使用する

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

マトリックスのタイプを混合する

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

ネスト配列

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

動的コードから始める能力

val numbers = Array(5){ it*2}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.