Javaの質問です。

>|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がイコールだった場合は、きちんと判別してくれるのですが、それ以外の場合はなぜか無視されます。なぜでしょうか。

たぶんこの説明では分かりにくいかと思いますので、少しでもこうではないかという心当たりがありましたら何でもいいのでお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/08/08 19:03:22
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント35pt

おそらく文字列の比較の部分が問題なのでしょう。

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 クラスのインポートが必要です。)

id:Nasinanasi

ありがとうございます!

equalsでちゃんと動くようになりました。

サンプルまで書いていただいて、ほんとうに助かります。こちらのほうが断然スマートですね。参考にさせていただきます!

2008/08/08 18:59:31
id:newta No.2

回答回数68ベストアンサー獲得回数7

ポイント35pt

まずクラスの中身を比べたいときは

equalsメソッドを使いましょう。

ポインタが同じであると断言できるのならば == でも良いですが。

次に

if(nextAddress == alreadyUrl[i]){

 nextAddress = urlReturn();

}

となっていますが、

==の場合、urlReturn()が実行され、

その返ってきた値はちゃんとチェックされるのでしょうか?

ここで出されているプログラムは

プログラムとしてコンパイルできるものではないので

ちょっと分からないですが。

id:Nasinanasi

ありがとうございます!equalsでしたね。すっかり忘れていました。

あと、ご指摘もありがとうございます。質問文には、省略して書いちゃいましたが、ちゃんとチェックするようにしております。

2008/08/08 19:01:16
  • id:Nasinanasi
    Nasinanasi 2008/08/07 05:57:58
    >|Java|
    //すでに解析したURLの格納
    alreadyUrl[alreadyNum] = nextAddress;
    System.out.println("既出入り " + alreadyUrl[alreadyNum]);
    alreadyNum++;
    //次のURLを格納する
    nextAddress = urlReturn();
    for(int i=0;i < alreadyNum;i++){
    //既出あったら
    String escape = alreadyUrl[i];
    if(nextAddress == escape){
    //もう一度取得
    nextAddress = urlReturn();
    //もう次のアドレスないなら終わり
    if(nextAddress == null){
    break;
    } else {//もう一度既出ないかチェック
    i = -1;
    }
    }
    }
    ||<

    これが元のコードです。
  • id:taknt
    if(nextAddress == escape){

    if(nextAddress.equals(escape)){

    に変更するだけで いいかと思いますよ。
  • id:Nasinanasi
    Nasinanasi 2008/08/08 19:02:58
    ありがとうございます!
    equalsのことをすっかり忘れていましたw

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません