有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java jvm正在将字符串与StringBuffer进行比较。reverse()总是失败

我遇到了一个问题,我需要找到一个字符串中所有回文的子字符串。输入将始终为1个单词。测试输入为aabaa。我决定尝试聪明一点,为我的子字符串创建一个字符串缓冲区,然后使用反向方法与原来使用的字符串进行比较。等于。它不起作用

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

当我取消对第一个print语句的注释时,使用测试输入aabaa输出如下

a
aa
aab
aaba
aabaa
ab
aba
abaa
b
ba
baa

所以我得到了正确的子字符串,但是最后一个if语句从未解析为true,我不知道这是为什么


共 (1) 个答案

  1. # 1 楼答案

    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*length-2之间取一个子字符串
    • 要存储唯一的结果,请使用哈希集,而不是ArrayList。在哈希集上调用contains()是O(1),而在ArrayList上调用contains()是O(n)
    • 在Kotlin中,与Java不同,您可以使用a == b测试a是否等于b,即使a和b是引用