2012-09-20 115 views
0

可能重複:
How do I compare strings in Java?如果條件不正常工作

我寫了這個代碼:

public String[] removeDuplicates(String[] input){ 

    int i; 
    int j; 
    int dups = 0; 
    int array_length = input.length; 
    for(i=0; i < array_length; i++){ 
     //check whether it occurs more than once 
     for(j=0; j < array_length; j++){ 
      if (input[i] == input[j] && i != j){ 
       dups++; //set duplicates boolean true 
       input[j] = null; //remove second occurence 
      } //if cond 
     } // for j 
    } // for i 
    System.out.println("Category contained " + dups + " duplicates."); 
    return input; 
} 

這是爲了檢查是否字符串數組包含一個或多個重複項。但是,即使當我這樣定義數組時:

String[] temp = new String[2]; 
temp[0] = "a"; 
temp[1] = "a"; 

if條件未被「觸發」。我誤解了如何& &的作品?在我看來,程序應該首先檢查兩個字符串是否相同(它們是...),然後檢查兩個索引是否相同。如果不是,它應該執行操作。 但是,程序似乎認爲不然。

+1

沒有直接關係刪除重複的,但你可以加快這通過初始化J =我,因爲你顯然不需要重新測試下部串。你還應該在比較之前檢查輸入[i]是否爲空... – sybkar

+1

你甚至可以避免檢查'i!= j'。您只需將'j'初始化爲'i + 1'。所以第二個for循環看起來像︰for(j = i + 1; j Nejc

回答

5

一個在Java中最常見的錯誤是假設String是一個對象時,其對象的引用。當您使用==時,您是比較參考,而不是其內容。這就是爲什麼.equals()需要比較其內容。

BTW你可以用

public static String[] removeDuplicates(String[] input){ 
    return new HashSet<String>(Arrays.asList(input)).toArray(new String[0]); 
} 
+1

非常感謝,甚至超過我的要求:)完美 – padrino

4

Java中的==運算符檢查兩個對象是否相同,而不是它們是等於。兩個字符串可能具有相同的內容,並且爲了平等而負面比較。您需要使用equals代替:

if (i != j && input[i].equals(input[j])){ 
} 

如果null值在input元素之間允許的,你需要一個null檢查添加到您的病情,以避免異常:

if (i != j && input[i] != null && input[i].equals(input[j])){ 
} 
2

決不使用==檢查兩個對象具有相同的值。使用equals()

==將檢查他們的存儲位置(如果兩個對象實際上只有一個),equals()是會告訴你,如果都表示同一信息的方法。

2

使用字符串(以及任何非基本類型)時,請記住==通過引用進行比較,而不是按值進行比較。改爲使用equals()

if (input[i].equals(input[j]) && i != j){ 
    dups++; //set duplicates boolean true 
    input[j] = null; //remove second occurence 
} //if cond 

作爲一個經驗法則,使用==當你要檢查,如果兩個對象是完全一樣的對象(你可以在那裏引用相同的地址把它看作如果兩個指針)。

+0

謝謝,那工作:) – padrino

+0

@Benedikt歡迎來到這裏,很高興成爲協助:) – Gamb

1

您應該使用String.equals來檢查字符串內容。該==操作只是檢查對象引用:

if (input[i] != null && input[i].equals(input[j]) && i != j) {