Array
陣列無法新增值,因為陣列是一個固定大小的陣列,可以修改。
建立陣列
陣列類型
建立陣列語法
IntArray
intArrayOf
DoubleArray
doubleArrayOf
LongArray
longArrayOf
ShortArray
shortArrayOf
ByteArray
byteArrayOf
FloatArray
floatArrayOf
BooleanArray
booleanArrayOf
Array<物件>
arrayOf
建立int陣列
1
2
3
val intarr : IntArray = intArrayOf ( 10 , 20 , 30 )
// 可省略類型,會自動推導。
val intarr = intArrayOf ( 10 , 20 , 30 )
建立double陣列
1
var d1 : DoubleArray = doubleArrayOf ( 1.0 , 2.0 , 3.0 )
指定大小,但值全為0
指定大小,但值為0的 int array,注意!array的內容不是5。
是用大寫開頭的IntArray()建立陣列。
1
2
3
4
val a3 : IntArray = IntArray ( 5 )
for ( i in a3 ){
println ( i )
}
arrayOf
除了用intArrayOf(),也可使用arrayOf()建立Int陣列。
arrayOf 通過<T>泛型,來決定陣列類型。
其中的<Int>不用寫,透過1,2,3的值來自動推導類型
1
var a : Array < Int > = arrayOf < Int >( 1 , 2 , 3 )
改成以下的方式建立Int陣列
1
var a : Array < Int > = arrayOf ( 1 , 2 , 3 )
變數的類型可以再省略,透過1,2,3的值來自動推導類型
建立String物件陣列
1
2
3
val arr : Array < String > = arrayOf ( "Tom" , "Kevin" , "Lucy" )
// 可省略類型,會自動推導。
val arr = arrayOf ( "Tom" , "Kevin" , "Lucy" )
二維陣列
1
2
var number2 = arrayOf ( arrayOf ( 1 , 2 , 3 ), arrayOf ( 4 , 5 , 6 ), arrayOf ( 7 , 8 , 9 ))
println ( "Number:${number2[2][1]}" )
陣列可以有各種類型
1
2
3
4
5
var number = arrayOf ( 1 , 2 , 3 , 'Y' )
number [ 0 ] = 'A' // char 類型
println ( "First elements:${number[0]}" )
number [ 0 ] = "TEST" // String 類型
println ( "First elements:${number[0]}" )
First elements:A
First elements:TEST
建立空的array
以下程式碼編譯錯誤,因為arrayOf沒有設定類型。
1
val names = arrayOf ( "" ) // val cannot be reassigned
1
val a2 = arrayOf < Int >()
想不出為什麼可以建立空的array,因為陣列是一個固定大小的陣列,建立空的陣列也沒辦法新增。
陣列相關方法
陣列轉List
安全取值
get(索引)可以取得元素的值,但搭配以下二種更安全。
語法
無此元素,就傳回預設值
集合變數.getOrElse(索引) { "預設值"}
無此元素傳回null,使用貓王運算子?:,印出預設值
集合變數.getOrNull(索引) ?: "預設值"
1
2
3
4
val names = arrayOf ( "Tom" , "Kevin" , "Lucy" )
println ( names . get ( 0 ))
println ( names . getOrElse ( 5 ) { "no data" })
println ( names . getOrNull ( 5 ) ?: "no data" )
索引取值
語法
1
2
3
4
5
6
7
val names = arrayOf ( "Tom" , "Kevin" , "Lucy" )
println ( "${names[0]}" )
println ( "${names[1]}" )
println ( "${names[2]}" )
// 超出範圍
//println("${names[5]}")
// Index 5 out of bounds for length 3
修改
1
2
3
4
5
6
7
8
val names = arrayOf ( "Tom" , "Kevin" , "Lucy" )
names [ 0 ] = "Julien"
// 原來的tom改成julien
println ( "[0]:${names[0]}" )
// 印出Julien第二個字母u
println ( "[0][1]:${names[0][1]}" )
// 印出長度
println ( "Length of Julien:${names[0].length}" )
[0]:Julien
[0][1]:u
Length of Julien:6
first()
取出第一個元素。
1
2
val names = arrayOf ( "Tom" , "Kevin" , "Lucy" )
println ( "first of elements: ${names.first()}" )
last()
取出最後一個元素。
1
2
val names = arrayOf ( "Tom" , "Kevin" , "Lucy" )
println ( "last of elements:${names.last()}" )
size
1
2
val names = arrayOf ( "Tom" , "Kevin" , "Lucy" )
println ( "names elements:${names.size}" )
indexOf
搜尋在第幾個索引,找不到傳回-1
1
2
val namelist = listOf < String >( "Mary" , "Amy" , "Jery" )
println ( "search index = ${namelist.indexOf(" Amy ")}" )
contains
1
2
val names = arrayOf ( "Tom" , "Kevin" , "Lucy" )
println ( "array contains = ${names.contains(" Tom ")}" )
in
與contains功能一樣,都有包含的意思。
1
2
val names = arrayOf ( "Tom" , "Kevin" , "Lucy" )
println ( "Tom" in names )
遍歷集合
for裡面的i變數,前面不會有val或var,也不會有變數類型,只要記住以下3種for即可。
for
1
2
3
4
val arr = arrayOf ( 1 , 2 )
for ( i in arr ) {
println ( i )
}
foreach
1
2
3
4
val arr = arrayOf ( 1 , 2 )
arr . forEach { it ->
println ( it )
}
forEachIndexed
1
2
3
4
5
val arr = arrayOf ( 1 , 2 )
arr . forEachIndexed {
index , i ->
println ( "$index $i" )
}
其它遍歷方式
只要記得上面3種for,下面若仍有腦容量再記住吧。
iterator
通過iterator拿到陣列中每一項。
透過Array中的iterator()拿到 Iterator的介面。
next()取得陣列中的值。
hasNext()是否還有下一個元素讓你拿。
1
2
3
val arr = arrayOf ( 1 , 2 )
println ( arr . iterator (). next ())
println ( arr . iterator (). hasNext ())
indices
indices為index的複數,傳回array的索引值。
1
2
3
4
val arr = arrayOf ( 1 , 2 )
for ( i in arr . indices ) {
println ( i )
}
想拿到index跟valaue
同時想拿到index跟valaue,可以使用withIndex.返回一個對象有index跟value的屬性。
1
2
3
4
val arr = arrayOf ( 1 , 2 )
for ( i in arr . withIndex ()) {
println ( "index:${i.index}, value:${i.value}" )
}
index:0, value:1
index:1, value:2
要索引值使用withIndex()方法
1
2
3
4
var names2 : List < String > = listOf ( "Tom" , "Jack" , "lucy" )
for (( index , name ) in names . withIndex ()) {
println ( "$index:$name" )
}
indices會傳回陣列或集合的範圍
1
2
3
4
var names : List < String > = listOf ( "Tom" , "Jack" , "lucy" )
for ( index in names . indices ) {
println ( "$index: ${names[index]}" )
}