我只是开始Kotlin,所以我敢肯定有一个简单的方法可以做到这一点,但是我看不到。我想使用代码点将a分成单个长度的子字符串。在Java 8中,此方法有效:
localhost
输出为:
public class UtfSplit {
static String [] utf8Split (String str) {
int [] codepoints = str.codePoints().toArray();
String [] rv = new String[codepoints.length];
for (int i = 0; i < codepoints.length; i++)
rv[i] = new String(codepoints, i, 1);
return rv;
}
public static void main(String [] args) {
String test = "こんにちは皆さん";
System.out.println("Test string:" + test);
StringBuilder sb = new StringBuilder("Result:");
for(String s : utf8Split(test))
sb.append(s).append(", ");
System.out.println(sb.toString());
}
}
我将如何在Kotlin中这样做?尽管代码笨拙,但我可以找到代码点,而且我确定自己做错了。但是我无法从代码点回到字符串。整个字符串/字符界面对我来说似乎不一样,我只是不明白。
谢谢 史蒂夫·S。
答案 0 :(得分:1)
您使用与Java相同的运行时,因此代码基本上在做相同的事情。但是,尽管您可以将实用程序方法分组为一个对象,但Kotlin版本较短,并且也不需要类。这是使用顶级功能的版本:
fun splitByCodePoint(str: String): Array<String> {
val codepoints = str.codePoints().toArray()
return Array(codepoints.size) { index ->
String(codepoints, index, 1)
}
}
fun main(args: Array<String>) {
val input = "こんにちは皆さん"
val result = splitByCodePoint(input)
println("Test string: ${input}")
println("Result: ${result.joinToString(", ")}")
}
输出:
测试字符串:こんにちは皆さん
结果:こ,ん,に,ち,は,皆,さ,ん
注意:我对函数进行了重命名,因为编码并不重要,因为您只是按Codepoints进行拆分。
有些人可能会这样写,而没有局部变量:
fun splitByCodePoint(str: String): Array<String> {
return str.codePoints().toArray().let { codepoints ->
Array(codepoints.size) { index -> String(codepoints, index, 1) }
}
}
另请参阅:
Kotlin stdlib Array initializer,索引为w / lambda
Kotlin stdlib let函数