プロが教えるわが家の防犯対策術!

以下は、拡張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の要素全て取り出せると思ってました。

因みに、配列変数には配列要素が入ってるのではなくて「参照」が入ってるのはわかってます。
このことと、何か関係があるのか、、?

A 回答 (3件)

多次元配列は「配列を要素に持つ配列」です。


int [][] は int[] を要素に持つ配列です。
拡張forは要素を一つずつ処理するものですから、
前者は int[]の要素である int
後者は int[][]の要素である int[]
になります。
    • good
    • 0
この回答へのお礼

丁重なご回答ありがとうございます!!!!!!!
拡張forは要素を1つずつ処理する原則を理解できました!

お礼日時:2011/07/20 21:23

 私もJava初心者なので、大きなことはいえませんがfor文の基本構造を勘違いしていませんか?



 for文で要素として変化させる変数が一つになっていることを見落としてませんか?

 最初のリストでは、配列が一次元のものですので、変化させる変数は一つで問題がないと思います。

 二つ目のリストでは、配列が二次元のものになるため、この配列要素を取り出すには変数が二つ必要になると思います。

 そのため、二つ目のリストでは拡張for文をふたつ使い、各for文でふたつの変数を変化させ配列要素を取り出しています。2重のfor文になる理由はそこにあると思います。
 そのため、一度ご自身でこのコードを普通のfor文に書き換えて、どのように動作するかを体験することをオススメします。書き換えてテストする理由は、普通のfor文で拡張for文の動作を、コードの違いで実際には同じことしていることを理解するためです。見た目だけで判断してしまうと危険ではないかということです。
 そして、話は元にもどりますが、質問されている内容について、ご自身で考えている内容でコードを書き換えて、どういう動作をするか体験されるのもオススメします。




 話は変わりますが、過去に質問者さんの出している質問と、回答者さんの回答を何度も拝見していますが、回答者さんの回答はどれも、言葉遣いの良し悪しはともかくどれも丁寧に説明してくれていますし、いろいろと学習する上でのアドバイスがされていたように拝見しています。私自身すごく参考になっています。

 しかし、回答に解決済と出ているものの内容について再度同様の質問が上がったりしていたのは、過去の質問についての回答者さんからの回答をないがしろにしているようにも見て取れるときがありました。
 そこから、過去の回答者さんがだんだんあなたの質問に対して回答をしなくなったことをどう考えていますか?

 また、質問を上げるときの言葉の使い方についても、

>>それを見た上で、私の質問に答えてください。

という書き方は、いかがなものかと思います。まるでなにかテストの問題のようで、上から目線で質問しているように見受けられます。これは人に教えを請う態度とは到底思えません。
 このような質問の仕方しているのは貴方だけだと思います。一度質問をされる立場にたって、「これは大変そうだな、ひとつ教えてあげようか?」と思える質問の仕方であるかどうかご自身が質問される立場になったつもりで、自分が質問しているときに使っている言葉を考えてみてください。
 このような言葉で質問されて、気持ちよく回答を出す人は少ないと思います。何かのテストを受けているときに、回答を出すときは別でしょうけれど。

 他にも、「私の仮説では…」などの言葉がよく過去の質問でありましたが、仮説を立てることは悪いことではないのですが、なぜご自身でコードを書いてテストして確認をされてないのですか?
 質問している文脈から、仮説に対してご自身でその仮説を立証するためのコードを書いてテストしているように思われなかったのと、あくまで仮説をここの質問に入れているだけに見受けられたものですから。
 疑問を持ったことについて、仮説を立てることは良いことですし、それが正しいかどうかいろいろ試行錯誤することが理解の早道だと思います。そして、どうにも仮説のとおり行かなかったときとか、試行錯誤の結果、別の結果が出てしまったとかで混乱してしまったとき、ここに質問をされて諸先輩方に教えを請うのが良いのではないかと思います。
 別の方が、過去の回答の中で習うより慣れろ的なアドバイスしてくれてたのは、こういうことをやったほうがよいということだと思ってます。

 最後にいろいろな入門書等は、初心者にわかりやすいサンプルコードを掲載していますが、これをそのまま入力して結果を出して、「はい、終わり」というものではないと思います。そのサンプルコードを元に、いろいろと今まで仮定してきたことを盛り込んで、自分なりのコードに書き換えてテストすることも理解の早道だと思います。
 過去の諸先輩方の貴重な回答を糧に、よりよい学習をしていってください。

 また、急がば回れということわざもありますし、いろいろ脱線してもいいと思います。お互いがんばりましょう。


 
    • good
    • 0
この回答へのお礼

丁重なご回答ありがとうございます!!!

本当にその通りですよね、僕の学習の仕方や質問の仕方はおかしいことが自分でも薄々気がついてます。

たしかに、仮説ばかりでなく、実際コードを自分で書くことが大切ですよね、、
それなのに他人任せで、、

お互い頑張りましょう!

お礼日時:2011/07/20 21:21

>後者について『for(int n:a){』の文だけで多次元配列aの要素全て取り出せると思ってました



ん?逆にどうしてそう思ったの?
    • good
    • 0
この回答へのお礼

丁重なご回答ありがとうございます!


わかりません、、僕もなんでそう思ったのか、、、
たぶん僕はありえないほどバカです。。

お礼日時:2011/07/20 21:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!