kotlin разбил строку utf на подстроки одинаковой длины, используя кодовую точку - PullRequest
0 голосов
/ 16 декабря 2018

Я только начинаю kotlin, так что я уверен, что есть простой способ сделать это, но я этого не вижу.Я хочу разбить на подстроки одинарной длины, используя кодовые точки.В Java 8 это работает:

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());
    }
}

Вывод:

Test string:こんにちは皆さん
Result:こ, ん, に, ち, は, 皆, さ, ん, 

Как бы я сделал это в kotlin ??Я могу добраться до кодовых точек, хотя это неуклюже, и я уверен, что я делаю это неправильно.Но я не могу добраться от кодов до строк.Весь интерфейс строки / символа мне кажется другим, и я просто не понимаю.

Спасибо, Стив С.

1 Ответ

0 голосов
/ 16 декабря 2018

Вы используете ту же среду выполнения, что и 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(", ")}")
}

Вывод:

Тестовая строка: 100 ん に ち は 皆 さ ん

Результат: こ, ん, に, ち, は, 皆, さ, ん

Примечание: я переименовал функцию, потому что кодировка на самом деле не имеет значения, поскольку вы просто разбиваете по кодам.

Некоторые могут написать это безлокальная переменная:

fun splitByCodePoint(str: String): Array<String> {
    return str.codePoints().toArray().let { codepoints ->
        Array(codepoints.size) { index -> String(codepoints, index, 1) }
    }
}

См. также:

...