2012-09-20 72 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) {