jvm比较String和StringBuffer.reverse()总是失败

Gra*_*mes 1 java string kotlin

我有一个问题,我要找到一个字符串作为回文的所有子串.输入总是1个字.测试输入是aabaa.我决定尝试聪明并创建我的子串的字符串缓冲区然后使用reverse方法与使用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)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我取消注释第一个print语句时,输出看起来像使用测试输入aabaa

a
aa
aab
aaba
aabaa
ab
aba
abaa
b
ba
baa
Run Code Online (Sandbox Code Playgroud)

所以我得到了正确的子串,但最后一个if语句永远不会解析为真,我不知道为什么会这样.

JB *_*zet 5

sub是一个字符串.rev是一个StringBuffer.它们不能相等,因为它们甚至没有相同的类型.

补充说明:

  • 不要使用StringBuffer.使用StringBuilder.StringBuffer是不必要的同步,不应再使用了(就像不应该使用Vector而应该使用ArrayList).
  • for (i in 0..input.length - 1)可以写得for (i in 0 until input.length)更优雅
  • input.substring(i, i + j) 不能正确:在两个循环的末尾,我将是长度-1,并且j将是长度-1,因此你将在长度-1和2*长度-2之间取一个子串.
  • 要存储唯一结果,请使用HashSet,而不是ArrayList.在HashSet上调用contains()是O(1),而在ArrayList上调用O(n).
  • 在Kotlin中,与Java不同,您可以使用它a == b来测试a是否等于b,即使a和b是引用.