Intereting Posts
Как получить ссылку на пользовательские идентификаторы в значениях / ids.xml Котлин показал несоответствие типов в фрагменте Firebase Android – создайте пользователя с помощью электронной почты и пароль в Kotlin Есть ли способ сделать виджет ViewPager DecorView с содержимым фрагмента? Я хочу открывать файлы из папок Разница между MutableList и List в Котлине Класс данных Kotlin: как читать значение свойства, если я не знаю его имени во время компиляции? permissionsdispatcher и несколько @ NeedsPermission с kotlin Вызывающая (базовая) делегированная функция при использовании делегирования класса из переопределения Утечка памяти активности Kotlin Что такое эквивалент Котлина для поразрядного или с присвоением '| ='? Является ли экземпляр более дорогостоящим, чем вспомогательный объект val? Какие пакеты / функции импортируются по умолчанию в Котлин? Переопределение функции с дженериками в котлине Какая особенность языка в Котлине может вызвать утечку памяти?

jvm сравнение String с StringBuffer.reverse () всегда не выполняется

У меня была проблема, когда я должен был найти все подстроки строки, которые являются палиндромами. Ввод всегда будет 1 слово. Тестовый ввод был ааба. Я решил попробовать быть умным и создать строковый буфер моей подстроки, а затем использовать обратный метод для сравнения с оригиналом, используя String.equals. Это не сработало.

import java.util.* fun main(args: Array<String>) { val scan = Scanner(System.`in`) val input = scan.next() val found = ArrayList<String>() for (i in 0..input.length - 1) { for (j in 0..input.length - i) { val sub = input.substring(i, i + j) if (!found.contains(sub)) { // println(sub) found.add(sub) val rev = StringBuffer(sub).reverse() if (sub.equals(rev)) { println(rev) } } } } } 

Когда я раскомментирую первый оператор печати, результат выглядит так, используя тестовый ввод aabaa

 a aa aab aaba aabaa ab aba abaa b ba baa 

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

Solutions Collecting From Web of "jvm сравнение String с StringBuffer.reverse () всегда не выполняется"

sub – строка. rev – StringBuffer. Они не могут быть равными, так как они даже не имеют одного и того же типа.

Дополнительные замечания:

  • не используйте StringBuffer. Используйте StringBuilder. StringBuffer бесполезно синхронизирован и больше не должен использоваться (так же, как вектор не должен использоваться, а ArrayList должен быть вместо этого).
  • for (i in 0..input.length - 1) можно записать for (i in 0 until input.length) который является более элегантным
  • input.substring(i, i + j) не может быть прав: в конце двух циклов i будет длиной – 1, а j будет длиной – 1, и вы, таким образом, возьмете подстроку между длиной – 1 и 2 * длина – 2.
  • для хранения уникальных результатов используйте HashSet, а не ArrayList. Вызов содержит () в HashSet – это O (1), тогда как O (n) на ArrayList.
  • в Kotlin, в отличие от Java, вы можете использовать a == b для проверки, если a равно b, даже если a и b являются ссылками.