bra*_*oob 0 string substring kotlin
例子
val string = "Large mountain"
我想获得一个从“t”字符的索引开始直到“t”+ 7 的索引的子字符串,其中 7 是任意的或字符串的结尾。
val substring = "tain"
假设字符串更大
val string2 = "Large mountain and lake"
我想回来
val substring2 = "tain and l"
如果我尝试 substring(indexOf("t") ,(indexOf("t") + 7) )
在第二种情况下,如果我现在使用“大山”,我会得到索引越界异常。
我认为没有特别优雅的方法可以做到这一点。
\n一种相当简短易读的方法是:
\nval substring = string.drop(string.indexOf(\'t\')).take(7)\nRun Code Online (Sandbox Code Playgroud)\n它用于indexOf()定位字符串中的第一个\'t\'字符,然后drop()删除所有前面的字符,并take()从那里取出(最多)7 个字符。
\'t\'但是,它会创建几个临时字符串,如果字符串中没有,则会给出 IllegalArgumentException 。
提高稳健性和效率需要更多代码,例如:
\nval substring = string.indexOf(\'t\').let {\n if (it >= 0)\n string.substring(it, min(it + 7, string.length))\n else\n string\n}\nRun Code Online (Sandbox Code Playgroud)\n该版本允许您在没有\'t\'(在else分支中)时控制结果;它还避免创建任何临时对象。 \xe2\x80\x82 与之前一样,它用于indexOf()定位第一个\'t\',但随后min()计算出子字符串可以有多长,并substring()一次性生成它。
如果你经常这样做,你当然可以将它放入你自己的函数中,例如:
\nfun String.substringFrom(char: Char, maxLen: Int)\n = indexOf(char).let {\n if (it >= 0)\n substring(it, min(it + maxLen, length))\n else\n this\n }\nRun Code Online (Sandbox Code Playgroud)\n然后你可以用例如调用"Large mountain".substringFrom(\'t\', 7)