4

後でハッシュマップを使用して配列の並べ替えに関与する文字列配列に値を追加すると、奇妙な問題が発生します。ファイル名がXFR900aで、XFR900の部分が次のコードを使用して配列に追加されています。

private ArrayList<String> Types = new ArrayList<String>();

...

Types.add(name.substring(0,(name.length() - 1));
System.out.println(name.substring(0,(name.length() - 1));

「XFR900」を示す行を印刷することもできますが、代わりに次のコードを使用すると、後で配列の並べ替えの動作が異なります。

Types.add("XFR900");
System.out.println(name.substring(0,(name.length() - 1));

これは単に手動で行われる部分文字列部分であり、非常に混乱します。

そこには奇妙な非ASCII文字が含まれているはずなので、部分文字列に代わる良い方法はありますか?

フィル

アップデート

みなさん、コメントありがとうございます。後で文字列を比較するコードの一部を次に示します。

    for (int i=0;i< matchedArray.size();i++){

        //run through the arrays
        if (last == matchedArray.get(i)) {
            //add arrays to a data array
            ArrayList data = new ArrayList();
            data.add(matchedArray1.get(i));
            data.add(matchedArray2.get(i));
            data.add(matchedArray3.get(i));
            data.add(matchedArray4.get(i));
            data.add(matchedArray5.get(i));
            //put into hash map 
            map.put(matchedArray.get(i), data);
        }
        else {
            //TODO
            System.out.println("DO NOT MATCH :" + last + "-" + matchedArray.get(i));

ご覧のとおり、テストSystem.out.println( "DO NOTMATCH"...を追加しました。以下に出力を示します。

一致しない:FR99-XFR900一致しない:XFR900-XFR900

XFR900aファイル名でのみサブストリングを実行します。問題は、テスト行が最後に印刷される!= matchArray.get(i)ですが、ディスプレイに印刷された場合は同じになります。

フィル

4

3 に答える 3

3

==文字列の内容を比較するために演算子を使用しないでください。==同じオブジェクトかどうかを確認します。last.equals(matchedArray.get(i))代わりに書いてください。このequals()メソッドは、オブジェクトが同じであるかどうかではなく、オブジェクトが等しいかどうかをチェックします。その場合String、2つの文字列が同じ文字で構成されているかどうかをチェックします。これはあなたの奇妙な行動を排除するかもしれません。

PS:==Java仮想マシンが最適化を行うため、文字列上の動作は少し予測できません。2つの文字列が等しい場合、jvmが両方に同じオブジェクトを使用する可能性があります。Stringオブジェクトはとにかく不変であるため、これが可能です。これは、部分文字列を手動で書き留めた場合の動作の違いを説明します。1つのケースでは、jvmは最適化されますが、他のケースでは最適化されません。

于 2012-08-02T12:48:42.757 に答える
0

.equals()文字列だからではなく使ってください==

if (last.equals(matchedArray.get(i))) {}
于 2012-08-02T12:51:09.620 に答える
0

演算子はオブジェクト参照の等価性をチェックするため、値をチェックする場合は==演算子を使用しないでください。参照ではなく、値をチェックする等号演算子を使用してください。

for (int i=0;i< matchedArray.size();i++){

//run through the arrays if (last.equals(matchedArray.get(i))) { // Line edited //add arrays to a data array ArrayList data = new ArrayList(); data.add(matchedArray1.get(i)); data.add(matchedArray2.get(i)); data.add(matchedArray3.get(i)); data.add(matchedArray4.get(i)); data.add(matchedArray5.get(i)); //put into hash map map.put(matchedArray.get(i), data); } else { //TODO System.out.println("DO NOT MATCH :" + last + "-" + matchedArray.get(i));
于 2015-07-24T13:18:18.197 に答える