>|Java|
alreadyUrl[alreadyNum] = nextAddress;
alreadyNum++;
nextAddress = urlReturn();//新しいURLを返すメソッド
for(int i=0;i < alreadyNum;i++){
if(nextAddress == alreadyUrl[i]){
nextAddress = urlReturn();
}
}
||<
上記のようなプログラムをurlReturn()がnullを返すまで、ぐれぐると回します。一度出てきたURLは省きたいので、一度出てきたURLはalreadyURL変数に入れて、新しくurlRetrun()が返してきたURLと付き合わせて重複がないかチェックしたいと思っています。しかしなぜか、alreadyURLの配列とnextAddressのイコールがきちんと動いてくれません。alreadyURLの配列に最後に入れたURLとnextAddressがイコールだった場合は、きちんと判別してくれるのですが、それ以外の場合はなぜか無視されます。なぜでしょうか。
たぶんこの説明では分かりにくいかと思いますので、少しでもこうではないかという心当たりがありましたら何でもいいのでお願いいたします。
おそらく文字列の比較の部分が問題なのでしょう。
http://www.asahi-net.or.jp/~dp8t-asm/java/articles/notes/03/arti...
文字列の比較は == ではなく、 equals を使用します。
String a = new String("abc"); String b = new String("def"); if ( a.equals( b ) ) { System.out.println("Same"); }
蛇足ですが、今回の場合 ArrayList を使用するとスマートな気がします。
下記に簡単なサンプルを例示します。
String nextAddress; ArrayList<String> alreadyUrl = new ArrayList<String>(); int i; while( ( nextAddress = urlReturn() ) != null ) { for( int i=0; i<alreadyUrl.size() ; i++ ){ if( nextAddress.equals( alreadyUrl.get(i) ) { break; } } if ( i == alreadyUrl.size() ) { alreadyUrl.add( nextAddress ); } }
http://www.nextindex.net/java/collection/ArrayList.html
(実行にはArrayList クラスのインポートが必要です。)
まずクラスの中身を比べたいときは
equalsメソッドを使いましょう。
ポインタが同じであると断言できるのならば == でも良いですが。
次に
if(nextAddress == alreadyUrl[i]){
nextAddress = urlReturn();
}
となっていますが、
==の場合、urlReturn()が実行され、
その返ってきた値はちゃんとチェックされるのでしょうか?
ここで出されているプログラムは
プログラムとしてコンパイルできるものではないので
ちょっと分からないですが。
ありがとうございます!equalsでしたね。すっかり忘れていました。
あと、ご指摘もありがとうございます。質問文には、省略して書いちゃいましたが、ちゃんとチェックするようにしております。
ありがとうございます!
equalsでちゃんと動くようになりました。
サンプルまで書いていただいて、ほんとうに助かります。こちらのほうが断然スマートですね。参考にさせていただきます!