Intereting Posts
Как смешивать несколько конструкторов родительского класса с val в дочернем классе Настройка проекта kotlin с градиентом Джексон-десериализация – классы данных Kotlin – значения по умолчанию для отсутствующих полей на картографе Ошибка компиляции вывода типа Kotlin при использовании API-интерфейса Akka Как получить все документы из коллекции Firestore в классе POJO? В чем разница между объектом и объектом данных? Установить и получить свойство непосредственно в делегате Правила Kotlin JUnit MVP + RxJava. Поместите планировщиков в презентаторе или в Interactor? Номер Android с RxJava обрабатывает пустой результат запроса Kotlin и идиоматический способ писать, «если не null, else …», основанный на изменяемой ценности Неожиданные жетоны (используйте, чтобы разделить выражения в одной строке) в котлин Рекурсивная проблема с toString в Котлине Охват кода студии Android, не показывающий классов Kotlin Запустите Kotlin REPL из контекста моего проекта Maven?

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 являются ссылками.