簡體   English   中英

jvm比較String與StringBuffer.reverse()總是失敗

[英]jvm comparing String with StringBuffer.reverse() always fails

我有一個問題,我要找到他所有回文字符串的子字符串。 輸入將始終為1個字。 測試輸入為aabaa。 我決定嘗試聰明一些,並為我的子字符串創建一個字符串緩沖區,然后使用反向方法與使用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

所以我得到正確的子字符串,但是最后一個if語句永遠不會解析為true,我也不知道為什么會這樣。

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)可能不正確:在兩個循環的末尾,i為length-1,j為length-1,因此您將在length-1之間采用一個子字符串和2 *長度-2。
  • 若要存儲唯一結果,請使用HashSet而不是ArrayList。 在HashSet上調用contains()是O(1),而在ArrayList上是O(n)。
  • 在Kotlin中,與Java不同,即使a和b是引用,也可以使用a == b來測試a是否等於b。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM