0

重複の可能性:
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;
}

文字列の配列に1つ以上の重複が含まれているかどうかを確認することになっています。ただし、次のように配列を定義しても:

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

if 条件が「トリガー」されていません。&& の仕組みを誤解していませんか? 私の意見では、プログラムは最初に 2 つの文字列が同一かどうか (どちらが...) をチェックし、次に 2 つのインデックスが同じかどうかをチェックする必要があります。そうでない場合は、操作を実行する必要があります。しかし、プログラムは別のことを考えているようです。

4

5 に答える 5

5

Java で最もよくある間違いの 1 つは、aStringがオブジェクトへの参照であるときに、a をオブジェクトであると想定することです。使用するとき==は、内容ではなく参照を比較しています。.equals()これが、それらの内容を比較する必要がある理由です。

ところで、重複を削除できます

public static String[] removeDuplicates(String[] input){
    return new HashSet<String>(Arrays.asList(input)).toArray(new String[0]);
}
于 2012-09-20T15:04:40.520 に答える
4

Javaの==演算子は、2 つのオブジェクトが等しいかどうかではなく、同じかどうかをチェックします。2 つの文字列が同一の内容を持ち、等しいかどうかを否定的に比較する場合があります。equals代わりに使用する必要があります:

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

null要素間で値が許可されている場合は、例外を回避するために条件にチェックをinput追加する必要があります。null

if (i != j && input[i] != null && input[i].equals(input[j])){
}
于 2012-09-20T15:01:21.353 に答える
2

==2 つのオブジェクトが同じ値であることを確認するために使用しないでください。使用するequals()

==はそれらのメモリ位置をチェックします (両方のオブジェクトが実際には 1 つのみである場合)。equals()これは、両方が同じ情報を表しているかどうかを示すメソッドです。

于 2012-09-20T15:01:30.600 に答える
2

文字列 (および非プリミティブ型) を扱う場合、== は値ではなく参照によって比較を行うことに注意してください。equals()代わりに使用してください。

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

経験則として、2 つのオブジェクトがまったく同じオブジェクトであるかどうかを確認する場合は == を使用します (両方のポインターが同じアドレスを参照しているかのように考えることができます)。

于 2012-09-20T15:01:43.937 に答える
1

String.equals文字列の内容を確認するために使用する必要があります。==オペレーターは、オブジェクト参照をチェックするだけです。

if (input[i] != null && input[i].equals(input[j]) && i != j) {
于 2012-09-20T15:02:18.383 に答える