Java jvm将字符串与StringBuffer.reverse()进行比较总是失败
我遇到了一个问题,我需要找到一个字符串中所有回文的子字符串。输入将始终为1个单词。测试输入为aabaa。我决定试着聪明一点,为我的子字符串创建一个字符串缓冲区,然后使用reverse方法与使用string.equals的原始字符串进行比较。它不起作用Java jvm将字符串与StringBuffer.reverse()进行比较总是失败,java,string,kotlin,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()
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)
}
}
}
}
}
所以我得到了正确的子字符串,但最后一个if语句从未解析为true,我不知道这是为什么。sub是一个字符串。rev是一个StringBuffer。它们不可能相等,因为它们甚至没有相同的类型
补充说明:
不要使用StringBuffer。使用StringBuilder。StringBuffer是不必要的同步,不应该再使用它,就像Vector不应该被使用,ArrayList应该被使用一样。
对于0中的i..input.length-1可以为0中的i编写,直到input.length更优雅为止
input.substringi,i+j不可能是正确的:在两个循环的末尾,i的长度为-1,j的长度为-1,因此您将取长度为-1和2*length-2之间的子字符串。
要存储唯一的结果,请使用哈希集,而不是ArrayList。在哈希集上调用contains是O1,而在ArrayList上调用contains。
在Kotlin中,与Java不同,您可以使用a==b来测试a是否等于b,即使a和b是引用。
sub是一个字符串。rev是一个StringBuffer。它们不可能相等,因为它们甚至没有相同的类型
补充说明:
不要使用StringBuffer。使用StringBuilder。StringBuffer是不必要的同步,不应该再使用它,就像Vector不应该被使用,ArrayList应该被使用一样。
对于0中的i..input.length-1可以为0中的i编写,直到input.length更优雅为止
input.substringi,i+j不可能是正确的:在两个循环的末尾,i的长度为-1,j的长度为-1,因此您将取长度为-1和2*length-2之间的子字符串。
要存储唯一的结果,请使用哈希集,而不是ArrayList。在哈希集上调用contains是O1,而在ArrayList上调用contains。
在Kotlin中,与Java不同,您可以使用a==b来测试a是否等于b,即使a和b是引用。
请注意,如果按照建议使用集合,则不需要像if!found.containssub{found.addsub;…},因为您可以使用iffound.addsub{…}。此外,如果要比较内容,不需要插入toString。就用吧。由于您只想打印它,并且只有当两个对象相等时,才可以使用ifsub.contentequalstringbuffersub.reverse{printlnsub;}注意,如果您使用建议的集合,则不需要像if!found.containssub{found.addsub;…},因为您可以使用iffound.addsub{…}。此外,如果要比较内容,不需要插入toString。就用吧。因为您只想打印它,并且只有当两个对象相等时,才可以使用ifsub.contentequalstringbuffersub.reverse{printlnsub;}
a
aa
aab
aaba
aabaa
ab
aba
abaa
b
ba
baa