以下は、拡張for文と配列に関するソースコードの一部を抜粋したものです。
それを見た上で、私の質問に答えてください。
int[]a={10,5,8,4,3};
for(int n:a){
System.out.print(n+" ");
}
int[][]a={{1,2},{4,5,6}};
for(int[]n:a){
for(int k:n){
System.out.print(k+" ");
}
System.out.println("");
}
質問1:何故、前者の配列は、『for(int n:a)』のように[]がついてなくても配列要素が取り出せるのに、後者の多次元配列は『for(int[]n:a){』のように『[]』がついた拡張for文を書いた上で、下にも拡張for文を書いた2重構造でないと配列要素を取り出せないのですか?
後者について『for(int n:a){』の文だけで多次元配列aの要素全て取り出せると思ってました。
因みに、配列変数には配列要素が入ってるのではなくて「参照」が入ってるのはわかってます。
このことと、何か関係があるのか、、?
No.3
- 回答日時:
私もJava初心者なので、大きなことはいえませんがfor文の基本構造を勘違いしていませんか?
for文で要素として変化させる変数が一つになっていることを見落としてませんか?
最初のリストでは、配列が一次元のものですので、変化させる変数は一つで問題がないと思います。
二つ目のリストでは、配列が二次元のものになるため、この配列要素を取り出すには変数が二つ必要になると思います。
そのため、二つ目のリストでは拡張for文をふたつ使い、各for文でふたつの変数を変化させ配列要素を取り出しています。2重のfor文になる理由はそこにあると思います。
そのため、一度ご自身でこのコードを普通のfor文に書き換えて、どのように動作するかを体験することをオススメします。書き換えてテストする理由は、普通のfor文で拡張for文の動作を、コードの違いで実際には同じことしていることを理解するためです。見た目だけで判断してしまうと危険ではないかということです。
そして、話は元にもどりますが、質問されている内容について、ご自身で考えている内容でコードを書き換えて、どういう動作をするか体験されるのもオススメします。
話は変わりますが、過去に質問者さんの出している質問と、回答者さんの回答を何度も拝見していますが、回答者さんの回答はどれも、言葉遣いの良し悪しはともかくどれも丁寧に説明してくれていますし、いろいろと学習する上でのアドバイスがされていたように拝見しています。私自身すごく参考になっています。
しかし、回答に解決済と出ているものの内容について再度同様の質問が上がったりしていたのは、過去の質問についての回答者さんからの回答をないがしろにしているようにも見て取れるときがありました。
そこから、過去の回答者さんがだんだんあなたの質問に対して回答をしなくなったことをどう考えていますか?
また、質問を上げるときの言葉の使い方についても、
>>それを見た上で、私の質問に答えてください。
という書き方は、いかがなものかと思います。まるでなにかテストの問題のようで、上から目線で質問しているように見受けられます。これは人に教えを請う態度とは到底思えません。
このような質問の仕方しているのは貴方だけだと思います。一度質問をされる立場にたって、「これは大変そうだな、ひとつ教えてあげようか?」と思える質問の仕方であるかどうかご自身が質問される立場になったつもりで、自分が質問しているときに使っている言葉を考えてみてください。
このような言葉で質問されて、気持ちよく回答を出す人は少ないと思います。何かのテストを受けているときに、回答を出すときは別でしょうけれど。
他にも、「私の仮説では…」などの言葉がよく過去の質問でありましたが、仮説を立てることは悪いことではないのですが、なぜご自身でコードを書いてテストして確認をされてないのですか?
質問している文脈から、仮説に対してご自身でその仮説を立証するためのコードを書いてテストしているように思われなかったのと、あくまで仮説をここの質問に入れているだけに見受けられたものですから。
疑問を持ったことについて、仮説を立てることは良いことですし、それが正しいかどうかいろいろ試行錯誤することが理解の早道だと思います。そして、どうにも仮説のとおり行かなかったときとか、試行錯誤の結果、別の結果が出てしまったとかで混乱してしまったとき、ここに質問をされて諸先輩方に教えを請うのが良いのではないかと思います。
別の方が、過去の回答の中で習うより慣れろ的なアドバイスしてくれてたのは、こういうことをやったほうがよいということだと思ってます。
最後にいろいろな入門書等は、初心者にわかりやすいサンプルコードを掲載していますが、これをそのまま入力して結果を出して、「はい、終わり」というものではないと思います。そのサンプルコードを元に、いろいろと今まで仮定してきたことを盛り込んで、自分なりのコードに書き換えてテストすることも理解の早道だと思います。
過去の諸先輩方の貴重な回答を糧に、よりよい学習をしていってください。
また、急がば回れということわざもありますし、いろいろ脱線してもいいと思います。お互いがんばりましょう。
丁重なご回答ありがとうございます!!!
本当にその通りですよね、僕の学習の仕方や質問の仕方はおかしいことが自分でも薄々気がついてます。
たしかに、仮説ばかりでなく、実際コードを自分で書くことが大切ですよね、、
それなのに他人任せで、、
お互い頑張りましょう!
No.2ベストアンサー
- 回答日時:
多次元配列は「配列を要素に持つ配列」です。
int [][] は int[] を要素に持つ配列です。
拡張forは要素を一つずつ処理するものですから、
前者は int[]の要素である int
後者は int[][]の要素である int[]
になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
この警告はどうすれば?
-
動的配列確保
-
Java CSVファイルをカンマごと...
-
『args[]』とは?
-
n番目に大きな値を探索する
-
Javaで文字と数字が混ざったも...
-
cloneメソッドについて (java)
-
[Ljava.lang.Stringってなんですか
-
配列で、値の入っている要素数...
-
【C#】ハッシュテーブル(連想...
-
無名配列の作成方法について質問
-
【Ajax通信&Java】配列の受け取...
-
ループ処理の際、最後だけ","を...
-
JSPやサーブレットでSystem.out...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
ダブルクォーテーションのrepla...
-
hiddenの値が期待した値で取得...
-
SwingでJtableのヘッダ行が表示...
-
javaで質問です。 文字列2023/2...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列で、値の入っている要素数...
-
【C#】ハッシュテーブル(連想...
-
[Ljava.lang.Stringってなんですか
-
javamailで複数人にメールを送...
-
この警告はどうすれば?
-
main(String[] args) の args...
-
javaで大容量テキストファイル...
-
Javaで文字と数字が混ざったも...
-
ページング
-
C言語でunsigned char配列を連...
-
Javaで文字を漢字であるか否か...
-
配列の中に複数存在する数がい...
-
C#で動的配列Listの中身をListB...
-
『args[]』とは?
-
同じ配列またはクラスを、2回...
-
java StringとString[]の違い
-
配列をセッションに割り当てた後で
-
【Ajax通信&Java】配列の受け取...
-
セッションを使ったint型の値の...
-
forループの評価(条件)式につ...
おすすめ情報