- ベストアンサー
forループの評価(条件)式について
以下のようなソースを書きました。 するとEclipseが「演算子<は引数の型int,Stringで未定義です」というエラーを出します。 エラーになる箇所は、下の方のループのroadInfoPo[5]を条件式にしている部分と、roadInfoPo[pointer+1]を条件指定としている部分です。 ループの評価をする条件式に、配列が指定できないとは考えにくいのですが。 私はまだまだJava初心者PGです。 おまえけに一人で作業をしており、周囲にJavaが分かる人もいません。 どうしたら解消できるのか、どなたか教えてくださいませm(__)m よろしくお願い致しますm(__)m roadInfoCountはint型です。 roadInfoValuesは長い文字列のString型です。 for (int j=1; j<=roadInfoCount; j++) { String[] roadInfoPo = roadInfoValues[j].split(","); //<re> Element re = document.createElement("re"); re.setAttribute("tp", roadInfoPo[0]); re.setAttribute("dv", roadInfoPo[1]); re.setAttribute("tt", roadInfoPo[2]); re.setAttribute("ds", roadInfoPo[3]); re.setAttribute("co", roadInfoPo[4]); rt.appendChild(re); //<sn> Element sn=document.createElement("sn"); sn.appendChild(document.createTextNode(roadInfoPo[5])); re.appendChild(sn); int pointer = 6; for (int k=0; k<roadInfoPo[5]; k++) { String tp = roadInfoPo[pointer]; String pn = roadInfoPo[pointer+1]; for (int n=0; n<roadInfoPo[pointer+1]; n++) { } }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
エラーになっている、for文内の比較で、int と String を比較しているのでエラーになっています。 演算子 "<" で比較するには、int と int のように数値で比較しないとコンパイルエラーになります。 roadInfoPo[5] の中身が、たとえ "3" のような数字であったとしても、Java から見ると文字列なので、k の値と"<"で比較することは出来ません。 数値同士で比較するには、Integer.parseInt() といったメソッドを使って、文字列から数値(この場合はint型)へ変換してください。 この場合は、for文を for (int k=0; k<Integer.parseInt(roadInfoPo[5]); k++) のように書き換えます。 なお、もしroadInfoPo[5]の中身に数字以外のものがあり、数値へ変換できない場合は、NumberFormatException が発生します。
その他の回答 (3)
- yuchi-co
- ベストアンサー率60% (29/48)
No.2の方がおっしゃったように、 Integer.paseInt();を使えばString型をint型に変換できます。 for (int k=0; k<Integer.paseInt(roadInfoPo[5]); k++)と指定してあげればきちんと評価できますが、もし配列の中に数字が入っていなかった場合、例外が発生します。 必ず、数字が入っている仕様だとは思いますが、もしも万が一入っていなかったら例外が発生しちゃうので、自分であれば、下記の様にするかもしれません。 int len = 0;//配列の条件の変数0で初期化 try{ //例外が発生する可能性があるのでtry~catchする len = Integer.paseInt(roadInfoPo[5]); }catch(NumberFormatException){ } for (int k=0; k<len; k++){ ・・・ こんな風にすれば、数字が入っていればその数字がint型に変換され、入っていなければ0になるのでエラー及び例外が出るのは避けられます。 ※やり方はこの限りではないのでいろいろやってみてください。
補足
何度もありがとうございますm(__)m おかげさまで先に進みました。 おっしゃる通り、確実に数字が入ります。 この数字が次の<タグ>~</タグ>のループ回数になるのですよ。 ありがとうございました。 不安な一人作業が、救われます。
- bgbg
- ベストアンサー率53% (94/175)
int型のnとString型のroadInfoPoをそのまま比較することはできません。 おそらく文字列roadInfoPo[pointer+1]の長さと比較したいのだと思われるので、 roadInfoPo[pointer+1].lentgh() と書き換えればいいと思います。roadInfoPo[5]も同様に。 length()の意味するところはAPIリファレンスでしっかり理解してくださいね。
補足
ご回答いただき、ありがとうございます。 データ型が異なるモノ同士を比較している意識がありませんでした。 ありがとうございました。
- yuchi-co
- ベストアンサー率60% (29/48)
for (int k=0; k<roadInfoPo[5]; k++) とfor (int n=0; n<roadInfoPo[pointer+1]; n++) の部分でroadInfoPoの配列を k(n)< の後ろに指定していますが、コードを見るとroadInfoPoはString型のようです。String型は<演算子で比較できません。 for文の書き方は for(初期処理,継続条件,継続処理)です。 ここで k < とn <の右側に来るのは当然int型でないと なりません。 数字が文字列より小さければという条件は評価できませんよね。 どのような条件で繰り返し処理を行いたいのでしょうか?
補足
早速のご回答、本当にありがとうございます。 おっしゃる通りです。 自分の間違いはわかりました。 私がしたいこととゆーのは、 String型のこの配列のこのインデックスの場所には、 String型だけれど数字が入っていまして、 この数をループが回る条件にしたいのです。 もちろん配列の各要素値は、毎回変わります。 ループの条件式に設定する寸前でint型変数に一時的に代入するような形にすればいいのでしょうか?
補足
回答ありがとうございます。 早速、書き直して見ます。 ご推察の通り、配列のこのインデックス番号の箇所には、常に数字が入るので、 それを条件にループをまわしたかったのです。 Javaがデータ型に凄く厳密であること。 肝に銘じて、頑張ってみます。