以下は、拡張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文の動作を、コードの違いで実際には同じことしていることを理解するためです。見た目だけで判断してしまうと危険ではないかということです。
そして、話は元にもどりますが、質問されている内容について、ご自身で考えている内容でコードを書き換えて、どういう動作をするか体験されるのもオススメします。
話は変わりますが、過去に質問者さんの出している質問と、回答者さんの回答を何度も拝見していますが、回答者さんの回答はどれも、言葉遣いの良し悪しはともかくどれも丁寧に説明してくれていますし、いろいろと学習する上でのアドバイスがされていたように拝見しています。私自身すごく参考になっています。
しかし、回答に解決済と出ているものの内容について再度同様の質問が上がったりしていたのは、過去の質問についての回答者さんからの回答をないがしろにしているようにも見て取れるときがありました。
そこから、過去の回答者さんがだんだんあなたの質問に対して回答をしなくなったことをどう考えていますか?
また、質問を上げるときの言葉の使い方についても、
>>それを見た上で、私の質問に答えてください。
という書き方は、いかがなものかと思います。まるでなにかテストの問題のようで、上から目線で質問しているように見受けられます。これは人に教えを請う態度とは到底思えません。
このような質問の仕方しているのは貴方だけだと思います。一度質問をされる立場にたって、「これは大変そうだな、ひとつ教えてあげようか?」と思える質問の仕方であるかどうかご自身が質問される立場になったつもりで、自分が質問しているときに使っている言葉を考えてみてください。
このような言葉で質問されて、気持ちよく回答を出す人は少ないと思います。何かのテストを受けているときに、回答を出すときは別でしょうけれど。
他にも、「私の仮説では…」などの言葉がよく過去の質問でありましたが、仮説を立てることは悪いことではないのですが、なぜご自身でコードを書いてテストして確認をされてないのですか?
質問している文脈から、仮説に対してご自身でその仮説を立証するためのコードを書いてテストしているように思われなかったのと、あくまで仮説をここの質問に入れているだけに見受けられたものですから。
疑問を持ったことについて、仮説を立てることは良いことですし、それが正しいかどうかいろいろ試行錯誤することが理解の早道だと思います。そして、どうにも仮説のとおり行かなかったときとか、試行錯誤の結果、別の結果が出てしまったとかで混乱してしまったとき、ここに質問をされて諸先輩方に教えを請うのが良いのではないかと思います。
別の方が、過去の回答の中で習うより慣れろ的なアドバイスしてくれてたのは、こういうことをやったほうがよいということだと思ってます。
最後にいろいろな入門書等は、初心者にわかりやすいサンプルコードを掲載していますが、これをそのまま入力して結果を出して、「はい、終わり」というものではないと思います。そのサンプルコードを元に、いろいろと今まで仮定してきたことを盛り込んで、自分なりのコードに書き換えてテストすることも理解の早道だと思います。
過去の諸先輩方の貴重な回答を糧に、よりよい学習をしていってください。
また、急がば回れということわざもありますし、いろいろ脱線してもいいと思います。お互いがんばりましょう。
丁重なご回答ありがとうございます!!!
本当にその通りですよね、僕の学習の仕方や質問の仕方はおかしいことが自分でも薄々気がついてます。
たしかに、仮説ばかりでなく、実際コードを自分で書くことが大切ですよね、、
それなのに他人任せで、、
お互い頑張りましょう!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
『args[]』とは?
-
[Ljava.lang.Stringってなんですか
-
javaについて
-
n番目に大きな値を探索する
-
この警告はどうすれば?
-
javaでEUC-JP文字列→UTF-8への変換
-
配列の中に複数存在する数がい...
-
配列について
-
配列で、値の入っている要素数...
-
配列をセッションに割り当てた後で
-
【C#】ハッシュテーブル(連想...
-
セッションを使ったint型の値の...
-
main(String[] args) の args...
-
java
-
Javaで文字と数字が混ざったも...
-
無名配列の作成方法について質問
-
多次元配列はなぜ必要???
-
2次元の配列となっているクラ...
-
JSPでデータ一覧表示
-
C++で、Excelの内容を取得する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
この警告はどうすれば?
-
C#で動的配列Listの中身をListB...
-
javaで大容量テキストファイル...
-
C言語でunsigned char配列を連...
-
n番目に大きな値を探索する
-
JavaのBase64デコードで正しく...
-
配列で、値の入っている要素数...
-
Javaで文字を漢字であるか否か...
-
配列の中に複数存在する数がい...
-
データベースから取得したデー...
-
【C#】ハッシュテーブル(連想...
-
Javaで文字と数字が混ざったも...
-
cloneメソッドについて (java)
-
ArrayListからBean配列に値をセ...
-
配列をセッションに割り当てた後で
-
int配列をbyte配列に変換
-
セッションを使ったint型の値の...
-
javamailで複数人にメールを送...
-
【Ajax通信&Java】配列の受け取...
おすすめ情報