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 === 比較地址