iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
Software Development

Kotlin 島深度之旅 30 天系列 第 18

[Day 18] Kotlin Journey - Array (陣列)

  • 分享至 

  • xImage
  •  

Array (陣列)

在 Kotlin 中也有 Array 的存在

物件陣列

為什麼這裡我特別說這個是 物件陣列 呢,因為在 Kotlin 中有基礎型態(primitive)的陣列,等等會介紹

arrayOfNulls<型態>(長度)

arrayOfNulls<Int>(3) 可以幫我們創造出一個長度是 3 的空 Integer 陣列,內容都是 null,注意這裡會是 Integer 物件型態的整數,對應到 Java 就會是 new Integer[3]

// new Integer[3];
val aryOfNulls = arrayOfNulls<Int>(3) 

arrayOf<型態>(資料1, 資料2, 資料3....)

如下所示 arrayOf 可以創造出我們想要的資料長度的陣列,注意 type 其實背後也都會是物件

val aryOfInt = arrayOf<Int>(1, 2, 3) // new Integer[]{1, 2, 3};
val aryOfBoolean = arrayOf<Boolean>(true, false) // new Boolean[]{true, false};
val aryOfLong = arrayOf<Long>(555L, 666L) // new Long[]{555L, 666L};
val aryOfPersonT = arrayOf<PersonT>(PersonT("tim", 123)) // new PersonT("tim", 123);

下面這個例子比較特別,並沒有指定型態,內容包含了數字,布林型態,字串,所以其實這裡用的型態就會是 Any以 java 來說就會是 new Object

// Any type, new Object[]{100, true, "test"};
val manyTypeAry = arrayOf(100, true, "test") 

陣列 lambda expression

還有一個特別的用法,就是在陣列後使用 lambda expression,會自動有一個 it 變數代表這個陣列的索引值,所以也就會是 0 1 2 3 4

val arrayLambda = Array<Int>(5) { // it 會是 index
    it
}
arrayLambda.forEach { println(it) } // 0 1 2 3 4

基礎型態陣列 (primitive type array)

因為有 8 種基礎型態,所以也有相對應的 8 種的創造方式

// 基礎型態 primitive type array
intArrayOf()
longArrayOf()
shortArrayOf()
byteArrayOf()
doubleArrayOf()
floatArrayOf()
booleanArrayOf()
charArrayOf()

下面的例子說明了如何創造基礎型態的陣列,主要就是 ArrayOf 前面多基礎型態的名稱,用法差不多

// 基礎型態 array 
val intAry0 = IntArray(5) // new int[5];
val intAry1 = intArrayOf() // int[] intAry = new int[0];
val intAry2 = intArrayOf(1, 3, 4) // int[] var43 = new int[]{1, 3, 4};
val charAry = charArrayOf('a', 'd', 'e') // new char[]{'a', 'd', 'e'};

這裡展示一些功能

collections 其實大概都有這些方法,這裡先提一些

// 取得陣列大小
val arySize = charAry.size // 3

// 陣列是否空
charAry.isEmpty()
charAry.isNotEmpty()

// 取得最後一個元素
charAry.last() // return the last element

// 取得陣列最後一個 index
charAry.lastIndex

// 比對最後一個元素
charAry.last { it == 'e' }
// 比對所有元素
charAry.all { it == 'e' } // Returns `true` if all elements match the given

// 至少有一個元素就回傳 true
charAry.any() // return true if array has at leat one element

// 陣列中有一個某一元素符合, 就回傳 true
charAry.any { it == 'a' } // Returns `true` if at least one element matches the given

取得元素

可以利用 [索引] 或 get(索引)

// get
println(charAry[1]) // 'd'
println(charAry.get(2)) // 'e'

設定元素

可以利用 [索引] = xxx 或 set(索引) = xxx

當然超出索引範圍是會丟出 Exception 的

// set
charAry[2] = 'F'
println(charAry)
charAry.set(2, 'f')
println(charAry)

// charAry[3] // java.lang.ArrayIndexOutOfBoundsException: 3

for loop

一般的 for

// iterate
val dataAry = arrayOf("Tim", "Beef", "Jean")
for (d in dataAry) {
    println(d)
}

dataAry.indices 是 array 的 index

for (idx in dataAry.indices) { // dataAry.indices 是 array 的 index
    println(dataAry[idx])
}

dataAry.withIndex() 可以幫我們取得 index 和 value

for (d in dataAry.withIndex()) { 
    println("idx: ${d.index}, value: ${d.value}")
}

二維陣列

這裡再舉一個二維陣列的例子,用法差不多,主要是第二層的時候就會用上一層的 來跑回 loop

// multi dimensional array
val twoDAry = arrayOf(
        arrayOf("0,0", "0,1", "0,2"),
        arrayOf("1,0", "1,1", "1,2"),
        arrayOf("2,0", "2,1", "2,2"),
        arrayOf("3,0", "3,1", "3,2")
)
for (rowData in twoDAry.withIndex()) {
    for (colData in rowData.value.withIndex()) {
        println("twoDAry index:${rowData.index},${colData.index}, value is ${colData.value}")
    }
}

以上就是今天的內容!謝謝大家!

今日練習的程式在這: 請點我


上一篇
[Day 17] Kotlin Journey - Enum, Sealed Class
下一篇
[Day 19] Kotlin Journey - List
系列文
Kotlin 島深度之旅 30 天31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言