1. 程式人生 > >Kotlin實戰(二)

Kotlin實戰(二)

Kotlin實戰(二)

一、字串

1.1、字串查詢

查詢第一個元素

//1、使用【index】或get(index)獲取元素,查詢第一個元素
println(a[0])//H
println(a.get(100))//陣列越界則丟擲StringIndexOutOfBoundsException異常

//2、使用 first/firstOrNull 查詢第一個元素
println(a.first())//H first查詢第一個元素,如果字串為空,則丟擲NoSuchElementException異常
println(a.firstOrNull())//H firstOrNull查詢第一個元素,如果字串為空,不會丟擲異常,返回null
println("".firstOrNull())//null //3、使用 first{}/firstOrNull{} 查詢 println(a.first { it =='H'})//H first{}函式查詢第一個元素,如果字串為空,則丟擲NoSuchElementException異常 println(a.firstOrNull { it =='H'})//H firstOrNull{}函式查詢第一個元素 ,如果字串為空,不會丟擲異常,返回null println("".firstOrNull { it =='H'})//null

查詢最後一個元素

val a = "Hello Kotlin"
println(a.get(a.length-1))//n //使用get(index)查詢最後一個元素 println(a[a.length-1])//n //使用【index】查詢最後一個元素 println(a.last())//n //使用last()查詢最後一個元素,注意:如果字串為null則丟擲NoSuchElementException異常 println(a.lastOrNull())//n //使用lastOrNull()查詢最後一個元素 ,如果字串為空,不會丟擲異常,返回null println("".lastOrNull())//null

查詢元素

查詢元素提供了兩個高階函式find{}

findLast{}

val a = "Hello Kotlin"
println(a.find { it=='H' })//H  從前往後查詢第一個H 字串為null 返回null ,對firstOrNull()處理
println(a.findLast { it=='H' })//H  從後往前查詢第一個H 字串為null 返回null 對lastOrNull()處理

查詢對應元素的下標

這裡提供查詢對應元素下標(每找到返回-1)的幾個函式:

  • indexOf() : 查詢某一個元素或字串在原字串中第一次出現的下標。
  • lastIndexOf() : 查詢某一個元素或字串在原字串中最後一次出現的下標。
  • indexOfFirst{} : 同indexOf()
  • indexOfLast{} : 同indexLastOf()
val a = "Hello Kotlin"
println(a.indexOf('o',0))//4  從第0位置開始查詢
println(a.indexOf("Kotlin",1))//6 從第1位置開始查詢
println(a.indexOfFirst { it == 'o' })//4
println(a.indexOfLast { it == 'o' })//7
println(a.lastIndexOf('o'))//7
println(a.lastIndexOf("llo"))//2

是否包含子字串

println(a.contains("ll"))//true  是否包含子字元 
println(a.contains("LL", true))//true  是否包含子字元  引數2:是否忽略大小寫

1.2、字串擷取

subString()函式

Kotlin中是使用了Java中的subString()函式

expect fun String.substring(startIndex: Int): String
expect fun String.substring(startIndex: Int, endIndex: Int): String
fun String.substring(range: IntRange): String

使用如下:

val a = "Hello Kotlin"
println(a.substring(0,4))//Hell 從第0位置擷取到第4位置  4不包含
println(a.substring(4))//o Kotlin  從第4位置擷取到結尾 4 包含
println(a.substring(IntRange(0,4)))//Hello 從第0位置擷取到第4位置 4包含 呼叫的原始碼是substring(range.start, range.endInclusive + 1)

substringAfter()函式

在第一次出現分隔符後返回子字串。如果字串不包含分隔符,則返回missingDelimiterValue,預設為原始字串。

fun String.substringAfter(delimiter: Char, missingDelimiterValue: String = this): String
fun String.substringAfter(delimiter: String, missingDelimiterValue: String = this): String 

使用如下:

println(a.substringAfter("l"))//lo Kotlin 擷取第一次出現指定字元(不包括該字元)之後字串 預設未找到返回原字串
println(a.substringAfter("KKKK","ERROR"))//ERROR 擷取第一次出現指定字元(不包括該字元)之後字串 未找到返回指定字串

substringAfterLast()函式

在最後一次出現分隔符後返回一個子字串。如果字串不包含分隔符,則返回missingDelimiterValue,預設為原始字串。

fun String.substringAfterLast(delimiter: Char, missingDelimiterValue: String = this): String
fun String.substringAfterLast(delimiter: String, missingDelimiterValue: String = this): String

使用如下:


println(a.substringAfterLast("l"))//in 擷取最後一次出現指定字元(不包括該字元)之後字串 預設未找到返回原字串
println(a.substringAfterLast("KKKK","ERROR"))//ERROR  擷取最後一次出現指定字元(不包括該字元)之後字串 未找到返回指定字串

substringBefore()函式

在第一次出現分隔符之前返回一個子字串。如果字串不包含分隔符,則返回missingDelimiterValue,預設為原始字串。

fun String.substringBefore(delimiter: Char, missingDelimiterValue: String = this): String
fun String.substringBefore(delimiter: String, missingDelimiterValue: String = this): String 

使用如下:

println(a.substringBefore("l"))//He 擷取第一次出現指定字元(不包括該字元)之前字串 預設未找到返回原字串
println(a.substringBefore("KKKK","ERROR"))//ERROR  擷取第一次出現指定字元(不包括該字元)之前字串 未找到返回指定字串

substringBeforeLast()函式

在最後一次出現分隔符之前返回一個子字串。如果字串不包含分隔符,則返回missingDelimiterValue,預設為原始字串。

fun String.substringBeforeLast(delimiter: Char, missingDelimiterValue: String = this): String
fun String.substringBeforeLast(delimiter: String, missingDelimiterValue: String = this): String

使用如下:

println(a.substringBeforeLast("l"))//Hello Kot  擷取最後一次出現指定字元(不包括該字元)之前字串 預設未找到返回原字串
println(a.substringBeforeLast("KKKK","ERROR"))//ERROR   擷取最後一次出現指定字元(不包括該字元)之前字串 未找到返回指定字串

subSequence()函式擷取

fun subSequence(startIndex: Int, endIndex: Int): CharSequence
fun CharSequence.subSequence(range: IntRange): CharSequence = subSequence(range.start, range.endInclusive + 1)

從原始碼中可以看出,其大致和subString()函式一樣,但是沒有 只傳遞startIndex的函式

使用如下:

val a = "Hello Kotlin"
println(a.subSequence(0,4))//Hell 從第0位置擷取到第4位置  4不包含
println(a.subSequence(IntRange(0,4)))//Hello   從第0位置擷取到第4位置  4包含 呼叫的原始碼是subSequence(range.start, range.endInclusive + 1)

1.3、字串替換

replace()函式

把原字串中的某一個字元全部替換成新的字元。然後返回新的字串

fun String.replace(oldChar: Char, newChar: Char, ignoreCase: Boolean = false): String
fun String.replace(oldValue: String, newValue: String, ignoreCase: Boolean = false): String

inline fun CharSequence.replace(regex: Regex, replacement: String): String = regex.replace(this, replacement)

inline fun CharSequence.replace(regex: Regex, noinline transform: (MatchResult) -> CharSequence): String =
    regex.replace(this, transform)

使用如下:

val a = "1Hello 2 Kotlin"
println(a.replace('o','8'))//1Hell8 2 K8tlin  將所有的o替換為8 不忽略大小寫
println(a.replace('O','8',true))//1Hell8 2 K8tlin 將所有的o替換為8 忽略大小寫
println(a.replace("Kotlin","Java"))//1Hello 2 Java 將所有的Kotlin替換為Java 不忽略大小寫
println(a.replace("kotlin","Java",true))//1Hello 1 Java 將所有的kotlin替換為Java 忽略大小寫

val r2 = Regex("[0-9]")
println(a.replace(r2,"2018"))//2018Hello 2018 Kotlin 使用正則匹配替換【0-9】為2018
println(a.replace(r2){
    if(it.value=="2"){
           "A"
    }else{
           "B"
    }
})//BHello A Kotlin  使用正則匹配替換【0-9】如果是2替換為A其他替換為B

replaceFirst()函式

把滿足條件的第一個字元或字串替換成新的字元或字串

fun String.replaceFirst(oldChar: Char, newChar: Char, ignoreCase: Boolean = false): String
fun String.replaceFirst(oldValue: String, newValue: String, ignoreCase: Boolean = false): String

inline fun CharSequence.replaceFirst(regex: Regex, replacement: String): String = regex.replaceFirst(this, replacement)

使用如下:

val a="Hello Kotlin"
println(a.replaceFirst('o','8'))//Hell8 Kotlin  將首個的o替換為8 不忽略大小寫
println(a.replaceFirst('O','8',true))//Hell8 Kotlin 將首個的o替換為8 忽略大小寫
println(a.replaceFirst("Kotlin","Java"))//Hello Java 將首個的Kotlin替換為Java 不忽略大小寫
println(a.replaceFirst("kotlin","Java",true))//Hello Java 將首個的kotlin替換為Java 忽略大小寫

println(a.replaceFirst(Regex("[a-z]"),"8"))//H8llo Kotlin 將首個符合正則[a-z]替換為8 不忽略大小寫
println(a.replaceFirst(Regex("[a-z]",RegexOption.IGNORE_CASE),"8"))//8ello Kotlin 將首個符合正則[a-z]替換為8 忽略大小寫

replaceBefore()函式

擷取滿足條件的第一個字元或字串後面的字串,包含滿足條件字元或字串自身,並在其前面加上新的字串。

fun String.replaceBefore(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String
fun String.replaceBefore(delimiter: String, replacement: String, missingDelimiterValue: String = this): String

使用如下:

val a="Hello Kotlin"
println(a.replaceBefore('l',"4"))//4llo Kotlin 擷取首個滿足條件的字元或字串 包括本身,擷取到結尾。在擷取後字串前面加上新字元
println(a.replaceBefore("ll","4"))//4llo Kotlin 擷取首個滿足條件的字元或字串 包括本身,擷取到結尾。在擷取後字串前面加上新字元

v

replaceBeforeLast()函式

擷取滿足條件的最後一個字元或字串後面的字串,包含滿足條件字元或字串自身,並在其前面加上新的字串。

fun String.replaceBeforeLast(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String 
fun String.replaceBeforeLast(delimiter: String, replacement: String, missingDelimiterValue: String = this): String 

使用如下:

val a="Hello Kotlin"
println(a.replaceBeforeLast('l',"4"))//4lin 擷取最後滿足條件的字元或字串 包括本身,擷取到結尾。在擷取後字串前面加上新字元
println(a.replaceBeforeLast("ll","4"))//4llo Kotlin 擷取最後滿足條件的字元或字串 包括本身,擷取到結尾。在擷取後字串前面加上新字元

replaceAfter()函式

擷取滿足條件的第一個字元或字串前面的字串,包含滿足條件字元或字串自身,並在其後面加上新的字串。

fun String.replaceAfter(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String 
fun String.replaceAfter(delimiter: String, replacement: String, missingDelimiterValue: String = this): String

使用如下:

val a="Hello Kotlin"
println(a.replaceAfter('l',"4"))//Hel4 從開始位置擷取到首個滿足條件字元或字串,包括本身,在擷取後字串後面加上新字元
println(a.replaceAfter("ll","4"))//Hell4 從開始位置擷取到首個滿足條件字元或字串,包括本身,在擷取後字串後面加上新字元

replaceAfterLast()函式

擷取滿足條件的最後一個字元或字串前面的字串,包含滿足條件字元或字串自身,並在其後面加上新的字串。

fun String.replaceAfterLast(delimiter: String, replacement: String, missingDelimiterValue: String = this): String 
fun String.replaceAfterLast(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String 

使用如下:

val a="Hello Kotlin"
println(a.replaceAfterLast('l',"4"))//Hello Kotl4  從開始位置擷取到最後滿足條件字元或字串,包括本身,在擷取後字串後面加上新字元
println(a.replaceAfterLast("ll","4"))//Hell4   從開始位置擷取到最後滿足條件字元或字串,包括本身,在擷取後字串後面加上新字元

1.4、字串分割

split()函式

fun CharSequence.split(vararg delimiters: Char, ignoreCase: Boolean = false, limit: Int = 0): List<String>
fun CharSequence.split(vararg delimiters: String, ignoreCase: Boolean = false, limit: Int = 0): List<String>

inline fun CharSequence.split(regex: Regex, limit: Int = 0): List<String>
fun CharSequence.split(regex: Pattern, limit: Int = 0): List<String>

使用方式:

val a="H1e2l13l41o"
println(a.split('e'))//[H1, 2l13l41o] 以e分割,預設不忽略大小寫
println(a.split("E",ignoreCase = true))//[H1, 2l13l41o] 以E分割 ignoreCase = true忽略大小寫
println(a.split("L",ignoreCase = true,limit = 2))//[H1e2, 13l41o] 以L分割 ignoreCase = true 忽略大小寫,limit = 2 最大返回分割後資料為2
println(a.split("e","4",ignoreCase = true,limit = 10))//[H1, 2l13l, 1o] 以e、4分割 ignoreCase = true 忽略大小寫,limit = 2 最大返回分割後資料為10

println(a.split(Regex("[0-9]")))//[H, e, l, , l, , o] 使用正則"[0-9]"分割,可指定分割後資料個數
println(a.split(Regex("[A-Z]",RegexOption.IGNORE_CASE)))//[, 1, 2, 13, 41, ] 使用正則"[0-9]"分割,RegexOption.IGNORE_CASE 忽略大小
println(a.split(Pattern.compile("[A-Z]",Pattern.CASE_INSENSITIVE)))//[, 1, 2, 13, 41, ] java方式使用正則"[0-9]"分割,Pattern.CASE_INSENSITIVE 忽略大小

splitToSequence()函式

fun CharSequence.splitToSequence(vararg delimiters: Char, ignoreCase: Boolean = false, limit: Int = 0): Sequence<String>
fun CharSequence.splitToSequence(vararg delimiters: String, ignoreCase: Boolean = false, limit: Int = 0): Sequence<String>

使用方式:

val a="H1e2l13l41o"
a.splitToSequence('e')//[H1, 2l13l41o] 以e分割,預設不忽略大小寫
a.splitToSequence("E",ignoreCase = true)//[H1, 2l13l41o] 以E分割 ignoreCase = true忽略大小寫
a.splitToSequence("L",ignoreCase = true,limit = 2)//[H1e2, 13l41o] 以L分割 ignoreCase = true 忽略大小寫,limit = 2 最大返回分割後資料為2
a.splitToSequence("e","4",ignoreCase = true,limit = 10)//[H1, 2l13l, 1o] 以e、4分割 ignoreCase = true 忽略大小寫,limit = 2 最大返回分割後資料為10

splitToSequence()split()不同於返回值,splitToSequence()返回Sequence<String>,而split()返回List<String>

1.5、字串的比較

expect fun String?.equals(other: String?, ignoreCase: Boolean = false)
open operator fun equals(other: Any?): Boolean

使用如下:

val a="Hello Kotlin"
val b=String(StringBuffer().append("Hello").append(" Kotlin"))
val c="hello kotlin"
println(a===b)//false   === 比較地址