Как развернуть строку в kotlin
Перейти к содержимому

Как развернуть строку в kotlin

  • автор:

Строки

Обратите внимание, что мы добавили знак доллара к имени переменной и используем её прямо в строке. В Java нам пришлось бы разбивать строку и соединять её с помощью конкатенации.

 // Java println("Привет " + catName + "! Как дела?"); 

Кстати, такой код тоже будет работать, но первый способ гораздо удобнее.

Мы понимаем, что речь идёт о строке, поэтому можно было написать код без указания типа.

 val catName = "Барсик" 

Если вам вдруг захочется вывести символ доллара, то используйте экранирование.

 println("Привет \$catName! Как дела?") // выводится: Привет $catName! Как дела? 

Мы использовали так называемый «строковый шаблон». За кулисами происходит соединение при помощи StringBuilder, но более удобным и быстрым способом.

Длину строки можно вычислить через функцию count().

 val murzik = "Мурзик" println(murzik.count()) 

Функции-расширения

Разработчики JetBrains добавили множество готовых функций-расширений для многих классов, в том числе и для строк. Найти их можно в файле String.kt (в студии дважды нажмите клавишу Shift и в поисковой строке наберите имя данного файла для просмотра исходника).

Некоторые примеры функций-расширений представлены ниже. На самом деле их больше, изучайте самостоятельно.

Пробежаться по строке

Строку можно рассматривать как массив символов.

 val cat = "Барсик" val character = cat[2] println(character) // выводит р 

Пробежаться по всей строке без использования индекса.

 val cat = "Барсик" for(char in cat)

Пробежаться по всей строки с использованием индекса.

 val cat = "Барсик" for (char in cat.indices)

Саму строку можно предварительно явно перевести в массив символов.

 for(char in cat.toCharArray())

Можно вызывать forEach.

 cat.forEach < char ->println(char) > 

Если вам нужен не только символ строки, но и его индекс, то вызываем forEachIndexed.

 cat.forEachIndexed println("Index $index Character $char")> // Результат Index 0 Character Б Index 1 Character а Index 2 Character р Index 3 Character с Index 4 Character и Index 5 Character к 

Если нужно получить отдельный символ строки по индексу без перебора всей строки, то просто указываем нужный индекс.

 val cat = "Барсик" val index = 5 println("Character at index $index in $cat is $") 

Если вы укажете несуществующий индекс, то получите исключение StringIndexOutOfBoundsException, поэтому делайте проверку.

Рассмотрим пример с числами. Допустим нужно произвести арифметические действия с целыми числами и вывести результат в строке.

 val a: Int = 9 val b: Int = 1 fun main(args: Array) < println("Осталось жизней: $") > 

Снова используем знак доллара, а действия с числами поместили в фигурные скобки. Kotlin сама разберётся с типами данных и сделает всю работу.

Выведем второй элемент массива.

 fun main(args: Array) < val names = arrayListOf("Мурзик") names.add("Васька") names.add("Барсик") println("Кота зовут $") > 

Опять используем знак доллара и фигурные скобки.

Можно даже использовать условие.

 val count = 9 print("value of count is $") 

Многострочный текст можно создать, используя тройные кавычки. Больше нам не нужны символы перевода строки \n, а также символы типа \t, \b, \r и т.д.

 val multipleStringLines = """ У лукоморья дуб зелёный; Златая цепь на дубе том: И днём и ночью кот учёный Всё ходит по цепи кругом; Идёт направо - песнь заводит, Налево - сказку говорит. """ 

Метод trimMargin() позволяет убрать «пустые» символы из текста по разделителю | (по умолчанию):

 val myString = """This is the first line |This is the second line |This is the third line |And fourth line """ println(myString.trimMargin()) 

На выходе получим.

 This is the first line This is the second line This is the third line And fourth line 

Можно задать свой собственный разделитель и указать его в методе.

 trimMargin(">") 

Если первая и последняя строки длинного предложения пустые, то они будут удалены и строки.

Можем делать со строкой знакомые операции в удобной обёртке.

 val cat = "Барсик" println(cat.reversed()) // кисраБ println(cat.takeLast(2)) // ик val kitty /cdn-cgi/l/email-protection" data-cfemail="8ae7fff8f0e3e1caede7ebe3e6a4e9e5e7">[email protected]" println(kitty.substringBefore("@")) // murzik 

Конвертируем строку в число

Сконвертировать строку в число можно через соответствующие методы.

 val str = "123" print(str.toLong()) 

Если нужно обработать ситуацию с null, то используйте другой метод.

 val str = "123.4" println(str.toLongOrNull()) // вернёт null 

По умолчанию мы подразумеваем десятичное счисление. Но возможна конвертация в другой системе счисления — двоичной, восьмеричной и т.д.

 val str = "11111111" print(str.toLongOrNull(2)) //255 val str = "105" print(str.toLongOrNull(8)) //69 

Также есть схожие методы toShort(), toShortOrNull(), toInt(), toIntOrNull(), toFloat(), toDouble() и т.д. Часть из них поддерживает перегруженные версии с другой системой счисления, но проверяйте поддерживаемые системы.

Не совсем про числа, но можно сконвертировать в булево значение.

 val str = "false" println(str.toBoolean()) 

Дополняем строку символами

Можно дополнить строку символами с самого начала или в конце.

 val name = "Barsik" val pad = name.padStart(10, '#') println(pad) // ####Barsik val name = "Barsik" val pad = name.padEnd(10, '*') println(pad) // Barsik**** 

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

Подстроки

 // подстрока с указанного индекса val result = "developer.alexanderklimov.ru".substring(10) // alexanderklimov.ru // подстрока до первого указанного разделителя val first = "developer.alexanderklimov.ru".substringBefore('.') // developer // подстрока после первого указанного разделителя val last = "developer.alexanderklimov.ru".substringAfter('.') // alexanderklimov.ru // подстрока после последнего указанного разделителя val last = "developer.alexanderklimov.ru".substringAfterLast('.') // ru // подстрока до последнего указанного разделителя val beforeLast = "developer.alexanderklimov.ru".substringBeforeLast('.') // developer.alexanderklimov 

Ещё пример для получения адреса сайта без http://.

 val superSite = "http://developer.alexanderklimov.ru" val index = superSite.lastIndexOf('/') println("Индекс нужного нам символа: $index") println(superSite.substring(index + 1)) // developer.alexanderklimov.ru // другой вариант println(superSite.substringAfterLast("/")) 

Встроенные функции

Kotlin содержит множество встроенных удобных функций для работы со строками. Часть из них уже использовалась в примерах выше. Упомянем ещё несколько полезных функций.

 val blank = " ".isBlank() // true, если пустая строка или пустые символы пробела, табуляции и т.п. // индекс последнего символа val lastIndex = "Кот Мурзик".lastIndex // 9 // переводим в верхний регистр первый символ строки // decapitalize() выполняем обратную задачу val capitalize = "кот Мурзик".capitalize() val withSpaces = "1".padStart(2) // добавляем пробел перед строкой val endZeros = "1".padEnd(3, '0') // "100" добавляем нули в конец val dropStart = "Kotlin".drop(2) // "tlin" убираем первые символы в указанном количестве val dropEnd = "Kotlin".dropLast(3) // "Kot" убираем последние символы в указанном количестве // возвращаем строку без первого символа, который удовлетворяет условию val string = "Мурзик" val result = string.dropWhile < it == 'М' >textView.text = result // урзик // возвращаем строку без последнего символа, который удовлетворяет условию val string = "Мурзик" val result = string.dropLastWhile < it == 'к' >textView.text = result // Мурзи // разбиваем на массив строк "A\nB\nC".lines() // [A, B, C] "ABCD".zipWithNext() // [(A, B), (B, C), (C, D)] // удаляем символы из заданного диапазона val string = "Кот, который гулял сам по себе" val result = string.removeRange( 3..28 // range ) // Функции removeXXX() хороши для строк в виде ##Cat##, чтобы убрать лишние символы // удаляем префикс из строки val string = "Кот, который гулял сам по себе" val result = string.removePrefix("Кот") // удаляем суффикс из строки val string = "Кот, который гулял сам по себе" val result = string.removeSuffix("себе") // удаляем заданный разделитель, который должен окружать строку с начала и с конца val string = "та, тра-та-та, мы везём с собой кота" val result = string.removeSurrounding( "та" // delimiter ) textView.text = result // , тра-та-та, мы везём с собой ко // Также можно указать разные начало и конец, которые окружают строку val string = "Тра-та-та, тра-та-та, мы везём с собой кота" val result = string.removeSurrounding( "Тра-", // prefix " кота" // suffix ) textView.text = result // та-та, тра-та-та, мы везём с собой // Добавляем отступы при явном переводе на новую строку val string = "Какой-то длинный текст, \nсостоящий из имён котов: " + "\nВаська" + "\nБарсик" + "\nРыжик" val result = string.prependIndent( " " // indent ) // Разбиваем символы на две группы. // В первую группу попадут символы в верхнем регистре, во вторую - символы в нижнем регистре val string = "Кот Васька и кот Мурзик - Друзья!" val result: Pair = string.partition < it.isUpperCase() >textView.text = result.first + ":" + result.second //КВМД:от аська и кот урзик - рузья! // Разбиваем строку на список строк. В качестве разделителя - перевод на новую строку val string = "Кот Васька\nКотМурзик\nКот Мурзик" // Split string into lines (CRLF, LF or CR) val lines: List = string.lines() textView.text = "Кол-во строк: $" lines.forEach < textView.append("\n" + it) >// Разбиваем строку на список строк с указанным числом символов. В последней строке может выводиться остаток val string = "Тра-та-та, тра-та-та, мы везём с собой кота" val list:List = string.chunked(11) list.forEach < textView.append("$it\n") >/* Тра-та-та, тра-та-та, мы везём с собой кота */ // Содержит ли строка только цифры (используем предикат) val string = "09032020" // Returns true if all characters match the given predicate. val result: Boolean = string.all < it.isDigit() >textView.append("Is the string $string contain only digit? $result") // Содержит ли строка хотя бы одну цифру (используем предикат) val string = "3 кота" // Returns true if at least one character matches the given predicate. val result: Boolean = string.any() < it.isDigit() >textView.append("Is the text \"$string\" contain any digit? $result") // Сравниваем две строки с учётом регистра val string1 = "This is a sample string." val string2 = "This is a SAMPLE string." if (string1.compareTo(string2, ignoreCase = true) == 0) < textView.append("\n\nBoth strings are equal, ignoring case.") >else

Можно фильтровать данные с помощью filter(). Допустим, мы хотим извлечь только цифры из строки.

 val string = "9 жизней (2016) - Nine Lives - информация о фильме" val filteredText = string.filter < it.isDigit() >textView.text = filteredText // 92016 

Если хочется решить обратную задачу и получить только символы, но не цифры — то достаточно вызвать filterNot().

 val filteredText = string.filterNot

replace()/replaceRange()

Для замены отдельных символов или строк используется функция replace(). Заменим отдельные символы в строке.

 val string = "Кит Кишка" val result = string.replace( 'и', // old char 'о', // new char true // ignore case Boolean = false ) textView.text = result // Кот Кошка 

Можно менять подстроки.

 val result = string.replace( "Собака", // old value "Кот", // new value true // ignore case ) textView.text = result // Кот - друг человека 

Вариант replace() с регулярным выражением. Создадим функцию перевода строки на «драконий» язык. В результате будет создана новая строка с нужными символами.

 private fun toDragonSpeak(phrase: String) = phrase.replace(Regex("[aeiou]")) < when (it.value) < "a" ->"4" "e" -> "3" "i" -> "1" "o" -> "0" "u" -> "|_|" else -> it.value > > println(toDragonSpeak("Kitten")) // K1tt3n 

Можно заменять подстроки через replaceRange(), указывая нужный диапазон. Существуют две версии этого способа.

 val string = "Тра-та-та, тра-та-та, мы везём с собой ежа" // The end index of the range is included // in the part to be replaced. val result = string.replaceRange( 39..40, // range "кот" // replacement ) textView.append(result) val result2 = string.replaceRange( 39, // start index 41, // end index "кот" // replacement ) textView.append("\n") textView.append(result2) 

Конвертируем строку в дату

 import java.time.LocalDate var parsedDate = LocalDate.parse("2020-07-27") println(parsedDate) 

Есть также вариант с использованием DateTimeFormatter.

 import java.time.LocalDate import java.time.format.DateTimeFormatter var parsedDate = LocalDate.parse("Wednesday, July 27, 2020", DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy")) println("Wednesday, July 27, 2020 : " + parsedDate) parsedDate = LocalDate.parse("July 27, 2020", DateTimeFormatter.ofPattern("MMMM dd, yyyy")) println("July 27, 2020 : " + parsedDate) parsedDate = LocalDate.parse("14/02/2020", DateTimeFormatter.ofPattern("dd/MM/yyyy")) println("14/02/2020 : "+parsedDate) parsedDate = LocalDate.parse("27 July,2019", DateTimeFormatter.ofPattern("dd MMMM,yyyy")) println("27 July,2019 : " + parsedDate) parsedDate = LocalDate.parse("11th April,2012", DateTimeFormatter.ofPattern("dd'th' MMMM,yyyy")) println("11th April,2012 : " + parsedDate) parsedDate = LocalDate.parse("27 Feb, 2001", DateTimeFormatter.ofPattern("dd MMM, yyyy")) println("27 Feb, 2001 : " + parsedDate) 

StringBuilder

У класса StringBuilder в Kotlin есть отдельная функция buildString(), которая поможет сократить количество кода для получения строки.

 fun printAlphabet() = buildString

Как развернуть строку в kotlin

Как реализовать реверс строки, чтоб при этом позиции небуквенных символов не менялись? Пример: a1bcd efg!h -> d1cba hgf!e.

Pavel Kurashov Уровень 17 Expert
21 июня 2020

3. Решение с charAt Мне одному кажется что цикл здесь как раз прямой — от 0 до длины строки? Мы собираем строку в обратной последовательности. Путаница в определениях.

Валерий Емельянов Уровень 41
16 июня 2020
алгоритм с XOR, вместо

 for (int i = 0; i < arr.length; i++) < result = result + arr[i]; >return result; 
 return new String(arr); 

Иван Ганжа Уровень 41
16 июня 2020

Есть задача в программировании, как поменять местами значение двух переменных без использование дополнительной. В последнем примере как раз этим и занимаются.

Nikolay Nickolskiy Уровень 27
16 июня 2020
Использовать в циклах String — это конечно дно днищенское.
Asad Vice Уровень 22
15 июня 2020

кто нибудь замерял по скорости и используемой памяти? Сравнительная таблица покажет предпочтительный вариант

15 июня 2020

То, что Stack устарел, означает что вместо него рекомендуют использовать другой класс — https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ArrayDeque.html с его методами push/pop

Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2024 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2024 JavaRush

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Преобразование коллекций

Стандартная библиотека Kotlin предоставляет целый набор функций-расширений для преобразования коллекций. Они создают новые коллекции из существующих на основе предоставляемых правил преобразования. В этом разделе находится общий обзор подобных функций.

Map

Группа функций, корнем которых является map() . Она позволяет преобразовать исходную коллекцию путём применения заданной лямбда-функции к каждому её элементу, объединяя результаты в новую коллекцию. При этом порядок элементов сохраняется. Этот процесс преобразования также называют маппингом (ориг. mapping). Если для преобразования коллекции вам требуется знать индекс элементов, то используйте функцию mapIndexed() .

fun main() < val numbers = setOf(1, 2, 3) println(numbers.map < it * 3 >) // [3, 6, 9] println(numbers.mapIndexed < idx, value ->value * idx >) // [0, 2, 6] > 

Если какой-либо элемент или элементы могут быть преобразованы в значение равное null , то вместо map() можно использовать функцию mapNotNull() , которая отфильтрует такие элементы и они не попадут в новую коллекцию. Соответственно, вместо mapIndexed() можно использовать mapIndexedNotNull() .

fun main() < val numbers = setOf(1, 2, 3) println(numbers.mapNotNull < if ( it == 2) null else it * 3 >) // [3, 9] println(numbers.mapIndexedNotNull < idx, value ->if (idx == 0) null else value * idx >) // [2, 6] > 

Ассоциативные списки можно преобразовывать двумя способами: преобразовывать ключи, не изменяя значения, и наоборот. Для преобразования ключей используйте функцию mapKeys() ; в свою очередь mapValues() преобразует значения. Они обе используют функцию преобразования, которая в качестве аргумента принимает пару «ключ-значение», поэтому вы можете работать как с ключом, так и со значением.

fun main() < val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11) println(numbersMap.mapKeys < it.key.uppercase() >) // println(numbersMap.mapValues < it.value + it.key.length >) // > 

Zip

Данная группа функций преобразования — zipping — берёт два списка и создаёт из их элементов пары. При этом пары создаются из элементов с одинаковыми индексами. В стандартной библиотеке Kotlin для такого преобразования есть функция-расширение zip() .

Если функцию zip() вызвать для одной коллекции и при этом передать ей в качестве аргумента другую коллекцию, то в результате вы получите список типа List> . Элементы коллекции-получателя будут первыми элементами в этих объектах Pair .

Если коллекции имеют разные размеры, то zip() вернёт новую коллекцию, длина которой равняется минимальной из исходных коллекций; последние элементы бОльшей коллекции будут отсечены.

Также zip() можно вызывать в инфиксной форме a zip b .

fun main() < val colors = listOf("red", "brown", "grey") val animals = listOf("fox", "bear", "wolf") println(colors zip animals) // [(red, fox), (brown, bear), (grey, wolf)] val twoAnimals = listOf("fox", "bear") println(colors.zip(twoAnimals)) // [(red, fox), (brown, bear)] >

Вместе с коллекцией zip() можно передать функцию преобразования, которая принимает два параметра: элемент коллекции-получателя и элемент коллекции-аргумента, при этом оба элемента располагаются в своих коллекциях по одинаковому индексу. В этом случае вернётся List с содержимым из результатов вычисления функции преобразования.

fun main() < val colors = listOf("red", "brown", "grey") val animals = listOf("fox", "bear", "wolf") println(colors.zip(animals) < color, animal ->"The $> is $color" >) // [The Fox is red, The Bear is brown, The Wolf is grey] > 

Для списка типа List> можно выполнить обратное преобразование — unzipping, которое разбирает пары на два отдельных списка:

  • В первый список помещаются первые элементы каждого объекта Pair .
  • Во второй список помещаются вторые элементы каждого объекта Pair .

Чтобы «распаковать» такой список вызовите для него функцию unzip() .

fun main() < val numberPairs = listOf("one" to 1, "two" to 2, "three" to 3, "four" to 4) println(numberPairs.unzip()) // ([one, two, three, four], [1, 2, 3, 4]) >

Associate

Функции преобразования данного типа позволяют создавать ассоциативные списки из элементов коллекции и связанных с ними значений. При этом элементы могут быть как ключами ассоциативного списка, так и значениями.

Основная функция здесь — associateWith() . Она создаёт Map , в которой элементы исходной коллекции являются ключами, а значения вычисляются с помощью функции преобразования. Если встречаются два равных элемента, то в ассоциативный список попадёт только последний из них.

fun main() < val numbers = listOf("one", "two", "three", "four") println(numbers.associateWith < it.length >) // > 

Для создания ассоциативного списка, в котором элементы коллекции будут выступать в роли значений, существует функция associateBy() . Она принимает функцию, которая в свою очередь возвращает ключ, основанный на значении элемента. Если встречаются два равных элемента, то в ассоциативный список попадёт только последний из них.

Также associateBy() можно вызвать с функцией, преобразующей значения.

fun main() < val numbers = listOf("one", "two", "three", "four") println(numbers.associateBy < it.first().uppercaseChar() >) // println(numbers.associateBy( keySelector = < it.first().uppercaseChar() >, valueTransform = < it.length >)) // > 

Есть еще один способ создания ассоциативного списка, при котором ключи и значения тем или иным образом создаются на основе элементов коллекции — при помощи функции associate() . Она принимает лямбда-функцию, которая возвращает объект Pair . Этот объект и представляет собой пару «ключ-значение».

Обратите внимание, что associate() создаёт недолговечные объекты Pair , которые могут повлиять на производительность. Поэтому используйте associate() только тогда, когда производительность для вас не критична, либо если эта функция предпочтительнее остальных.

Примером последнего является ситуация, когда ключ и значение для него создаются одновременно на основе элемента.

fun main() < data class FullName (val firstName: String, val lastName: String) fun parseFullName(fullName: String): FullName < val nameParts = fullName.split(" ") if (nameParts.size == 2) < return FullName(nameParts[0], nameParts[1]) >else throw Exception("Wrong name format") > val names = listOf("Alice Adams", "Brian Brown", "Clara Campbell") println(names.associate < name ->parseFullName(name).let < it.lastName to it.firstName >>) // > 

В примере выше сначала вызывается функция преобразования элемента, а затем происходит создание пары на основе полученного от этой функции результата.

Flatten

При работе с вложенными коллекциями вам могут пригодиться функции, обеспечивающие «плоский» доступ к их элементам.

Первая функция — flatten() . Её можно использовать для коллекции, содержащей другие коллекции, например, для List , в котором находятся Set -ы. Функция возвращает объединённый List , состоящий из всех элементов всех вложенных коллекций.

fun main() < val numberSets = listOf(setOf(1, 2, 3), setOf(4, 5, 6), setOf(1, 2)) println(numberSets.flatten()) // [1, 2, 3, 4, 5, 6, 1, 2] >

Другая функция — flatMap() , которая обеспечивает гибкий способ работы с вложенными коллекциями. Она принимает функцию, которая маппит элемент исходной коллекции в другую коллекцию. В качестве результата flatMap() возвращает объединённый список из всех обработанных элементов. По сути flatMap() ведёт себя как вызов map() (с возвращением коллекции в качестве результата маппинга) и flatten() .

data class StringContainer(val values: List) fun main() < val containers = listOf( StringContainer(listOf("one", "two", "three")), StringContainer(listOf("four", "five", "six")), StringContainer(listOf("seven", "eight")) ) println(containers.flatMap < it.values >) // [one, two, three, four, five, six, seven, eight] > 

Преобразование коллекции в String

С помощью функций joinToString() и joinTo() содержимое коллекции можно преобразовать в читаемый вид — String .

joinToString() на основе предоставленных аргументов объединяет элементы коллекции в строку. joinTo() делает то же самое, но добавляет результат к переданному объекту Appendable .

При вызове этих функций с аргументами по умолчанию, они вернут результат, аналогичный вызову toString() для коллекции: элементы будут представлены в виде String , разделённые между собой запятой с пробелом.

fun main() < val numbers = listOf("one", "two", "three", "four") println(numbers) // [one, two, three, four] println(numbers.joinToString()) // one, two, three, four val listString = StringBuffer("The list of numbers: ") numbers.joinTo(listString) println(listString) // The list of numbers: one, two, three, four >

Но также вы можете кастомизировать строковое представление коллекции, указав необходимые вам параметры при помощи специальных аргументов — separator , prefix , и postfix . Преобразованная строка будет начинаться с префикса ( prefix ) и заканчиваться постфиксом ( postfix ). А separator будет добавлен после каждого элемента, кроме последнего.

fun main() < val numbers = listOf("one", "two", "three", "four") println(numbers.joinToString( separator = " | ", prefix = "start: ", postfix = ": end" )) // start: one | two | three | four: end >

Если коллекция большая, то вы можете указать limit — количество элементов, которые будут включены в результат. При этом все элементы, превышающие limit , будут заменены одним значением аргумента truncated .

fun main() < val numbers = (1..100).toList() println(numbers.joinToString( limit = 10, truncated = "") ) // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, > 

Ну и наконец, чтобы кастомизировать представление самих элементов, передайте в качестве аргумента функцию transform .

fun main() < val numbers = listOf("one", "two", "three", "four") println(numbers.joinToString < "Element: $" >) // Element: ONE, Element: TWO, Element: THREE, Element: FOUR > 

Kotlin List reverse

Не сдаюсь, использую брутфорс)) .asReversed(), Collections.reverse(listStrings) -> ни в какую. Никаких изменений. Даже если переделать в Mutable List Хорошо. Попробуем поэкспериментировать.

var listStrings2: List = listOf("Hello", "World") println("$listStrings2") //[Hello, World] Collections.reverse(listStrings2) println("$listStrings2") //[World, Hello] 

Все работает. Кто может объяснить, в чем разница между этими двумя листами ? Задача простая до безобразия, какой-то ступор ( Заранее прошу прощения за тупой вопрос. Прошу не минусовать. Помогите разобраться !

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *