2014-12-27 25 views
2

我在Java中使用字符串比較有點小問題,我想比較兩個字符串,並且.equals([...])沒有給我正確的結果。字符串比較是錯的

我也試過如下:==.compareTo([...]).trim().equalsIgnoreCase([...]),創建具有默認語言環境的分頁器,並使用[collator].compare。 (全部失效)

第一個字符串來自已經創建的對象(字符串的內容來自數據庫),第二個字符串來自新創建的對象(但已傳遞給方法) ,這個String的內容來自同一個數據庫。

我很笨,現在該做什麼,我想嘗試的最後一件事就是將它轉換爲一些數字(即十六進制)。

我已經嘗試過寫兩個字符串到控制檯和手動查找差異,但有沒有...

代碼是這樣的:

public static Lagerplatz hinzufuegen(Lagerplatz lagerplatz) { 
    boolean neu = true; 

    if (lagerplaetze.isEmpty()) { 
     lagerplaetze.add(lagerplatz); 
     System.out.println(lagerplatz.getBezeichnung() + " erstmalig hinzugefügt!"); 
    } 

    for (int i = 0; i < lagerplaetze.size(); i++) { 
     System.out.println("'" + lagerplatz.getBezeichnung() + "'" + " - " + "'" 
       + lagerplaetze.get(i).getBezeichnung() + "'"); 
     if (lagerplatz.getBezeichnung().equalsIgnoreCase(lagerplaetze.get(i).getBezeichnung())) { 
      neu = false; 
     } 
    } 

    if (neu) { 
     lagerplaetze.add(lagerplatz); 
     System.out.println(lagerplatz.getBezeichnung() + " hinzugefügt!"); 
    } 
    return lagerplatz; 
} 

的如果一部分與(lagerplaetze.isEmpty ())確實起作用,在添加第一個之後,它應該檢查Lagerplatz(至少是它的名稱)是否已經存在於lagerplaetze-ArrayList中,如果是,則不添加,如果不添加。

通過它步進透露,對象是正確引用...

非常感謝提前和對不起,如果這個問題已經被回答了,但我不能找到在所有這些問題一個答案幫助。 ..

EDIT1:正火不會在這種情況下幫助, 「umlaute」(德語,O或ü)不會導致問題...

的字符串轉換爲一個byte []和將這個字節數組轉換爲String:

(Arrays.toString(lagerplatz.getBezeichnung().getBytes()).equalsIgnoreCase(
       Arrays.toString(lagerplaetze.get(i).getBezeichnung().getBytes()))) 

,然後比較它也不能解決問題,兩個字符串的字節是完全一樣的:'[72, 55, 48]' - '[72, 55, 48]'

EDIT2:這個問題是不是與字符串比較,這是因爲「Lagerplatz」類的變量是靜態的,它們在每次輸入循環時被替換... 也許刪除此問題?

+2

您可以嘗試使用Arrays.toString(str.getBytes(java.nio.charset.StandardCharsets.UTF_16)))' – RealSkeptic 2014-12-27 18:36:04

+0

getBezeichnung返回什麼來打印每個字符串的實際字節?代碼請。 – 2014-12-27 18:38:02

+0

您應該能夠通過從第一個'if'的底部返回'lagerplatz'並在將'neu'設置爲'false'後添加'break'來優化一些事情。 – dasblinkenlight 2014-12-27 18:39:38

回答

4

唯一一次兩個字符串,看起來完全相同相同,但equals()不會導致true是當unicode的組成是不同的。

例如可以構成一個元音變音(A)與單個字符:\u00C4 或者與A字符的組合,並且所述點(分音符號字符¨):\u0041\u0308

在本質上,你是使用兩個 unicode字符爲一個字母。因爲equals()比較字符,與dieresis形式不等於沒有形式。

爲了克服這個問題,我們必須在比較之前將每個字符串分解爲規範形式。

在Java中可以創建這樣的規範形式是這樣的:

java.text.Normalizer.normalize("Your String", java.text.Normalizer.Form.NFD); 

一旦標準化,equals()會達到預期效果。

顯然,由於您沒有提供任何數據,因此此答案可能會或可能不會匹配您的問題。 無論如何,你可能想要以某種形式標準化所有字符串,然後使用Set作爲數據結構,而不是列表。

+0

非常感謝您的回答hendrik! 歸我所有字符串,可悲的是這並沒有工作... '的String [] strLadungstraeger = Normalizer.normalize(rstImport.getString( 「txtItem」)。修剪(), \t \t \t \t \t Normalizer.Form.NFD )。分裂(」#」); \t \t \t字符串strLagerplatz = Normalizer.normalize(rstImport.getString( 「txtLagerplatz」)修剪(), \t \t \t \t \t Normalizer.Form.NFD);' **一些數據:** '10 erstmalighinzugefügt!' ''10' - '10'' ''1001' - '1001'' ''H70' - 'H70'' ''BL_Nord_1' - 'BL_Nord_1'' < - 同樣地 ' 'BL_Nord_1' - 'BL_Nord_1'' <---如上所示 – shagrinar 2014-12-27 19:42:43

+0

請參閱我的問題編輯2。剛發佈上面的評論時才意識到它... – shagrinar 2014-12-27 20:05:31