拡張for文と配列に関する質問

このQ&Aのポイント
  • 拡張for文を使った配列要素の取り出し方について質問しています。
  • 1つの配列に対しては、『for(int n:a)』のように[]がついていなくても配列要素を取り出すことができますが、多次元配列の場合には『for(int[]n:a)』のように[]が必要です。
  • 配列は参照を格納する変数であるため、要素の取り出し方に関係があるのかもしれません。
回答を見る
  • ベストアンサー

拡張for文について質問

以下は、拡張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の要素全て取り出せると思ってました。 因みに、配列変数には配列要素が入ってるのではなくて「参照」が入ってるのはわかってます。 このことと、何か関係があるのか、、?

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

多次元配列は「配列を要素に持つ配列」です。 int [][] は int[] を要素に持つ配列です。 拡張forは要素を一つずつ処理するものですから、 前者は int[]の要素である int 後者は int[][]の要素である int[] になります。

wantanton
質問者

お礼

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

その他の回答 (2)

  • bx407a4
  • ベストアンサー率61% (45/73)
回答No.3

 私もJava初心者なので、大きなことはいえませんがfor文の基本構造を勘違いしていませんか?  for文で要素として変化させる変数が一つになっていることを見落としてませんか?  最初のリストでは、配列が一次元のものですので、変化させる変数は一つで問題がないと思います。  二つ目のリストでは、配列が二次元のものになるため、この配列要素を取り出すには変数が二つ必要になると思います。  そのため、二つ目のリストでは拡張for文をふたつ使い、各for文でふたつの変数を変化させ配列要素を取り出しています。2重のfor文になる理由はそこにあると思います。  そのため、一度ご自身でこのコードを普通のfor文に書き換えて、どのように動作するかを体験することをオススメします。書き換えてテストする理由は、普通のfor文で拡張for文の動作を、コードの違いで実際には同じことしていることを理解するためです。見た目だけで判断してしまうと危険ではないかということです。  そして、話は元にもどりますが、質問されている内容について、ご自身で考えている内容でコードを書き換えて、どういう動作をするか体験されるのもオススメします。  話は変わりますが、過去に質問者さんの出している質問と、回答者さんの回答を何度も拝見していますが、回答者さんの回答はどれも、言葉遣いの良し悪しはともかくどれも丁寧に説明してくれていますし、いろいろと学習する上でのアドバイスがされていたように拝見しています。私自身すごく参考になっています。  しかし、回答に解決済と出ているものの内容について再度同様の質問が上がったりしていたのは、過去の質問についての回答者さんからの回答をないがしろにしているようにも見て取れるときがありました。  そこから、過去の回答者さんがだんだんあなたの質問に対して回答をしなくなったことをどう考えていますか?  また、質問を上げるときの言葉の使い方についても、 >>それを見た上で、私の質問に答えてください。 という書き方は、いかがなものかと思います。まるでなにかテストの問題のようで、上から目線で質問しているように見受けられます。これは人に教えを請う態度とは到底思えません。  このような質問の仕方しているのは貴方だけだと思います。一度質問をされる立場にたって、「これは大変そうだな、ひとつ教えてあげようか?」と思える質問の仕方であるかどうかご自身が質問される立場になったつもりで、自分が質問しているときに使っている言葉を考えてみてください。  このような言葉で質問されて、気持ちよく回答を出す人は少ないと思います。何かのテストを受けているときに、回答を出すときは別でしょうけれど。  他にも、「私の仮説では…」などの言葉がよく過去の質問でありましたが、仮説を立てることは悪いことではないのですが、なぜご自身でコードを書いてテストして確認をされてないのですか?  質問している文脈から、仮説に対してご自身でその仮説を立証するためのコードを書いてテストしているように思われなかったのと、あくまで仮説をここの質問に入れているだけに見受けられたものですから。  疑問を持ったことについて、仮説を立てることは良いことですし、それが正しいかどうかいろいろ試行錯誤することが理解の早道だと思います。そして、どうにも仮説のとおり行かなかったときとか、試行錯誤の結果、別の結果が出てしまったとかで混乱してしまったとき、ここに質問をされて諸先輩方に教えを請うのが良いのではないかと思います。  別の方が、過去の回答の中で習うより慣れろ的なアドバイスしてくれてたのは、こういうことをやったほうがよいということだと思ってます。  最後にいろいろな入門書等は、初心者にわかりやすいサンプルコードを掲載していますが、これをそのまま入力して結果を出して、「はい、終わり」というものではないと思います。そのサンプルコードを元に、いろいろと今まで仮定してきたことを盛り込んで、自分なりのコードに書き換えてテストすることも理解の早道だと思います。  過去の諸先輩方の貴重な回答を糧に、よりよい学習をしていってください。  また、急がば回れということわざもありますし、いろいろ脱線してもいいと思います。お互いがんばりましょう。  

wantanton
質問者

お礼

丁重なご回答ありがとうございます!!! 本当にその通りですよね、僕の学習の仕方や質問の仕方はおかしいことが自分でも薄々気がついてます。 たしかに、仮説ばかりでなく、実際コードを自分で書くことが大切ですよね、、 それなのに他人任せで、、 お互い頑張りましょう!

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

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

wantanton
質問者

お礼

丁重なご回答ありがとうございます! わかりません、、僕もなんでそう思ったのか、、、 たぶん僕はありえないほどバカです。。

関連するQ&A

  • JAVAのfor文で困っています。

    JAVAの勉強をしていますが、本の練習問題でわからなくて困っています。for文で以下の処理を行いたいです(do,whileはなしです)が、 *を5個ごとに改行したいのですが、改行してくれません。 問題の部分↓ if (n % 5 == 0) System.out.println(); 何か良い方法はありませんか?お願いします。 ------------------------------------------------- //(数を読み込んで)だ個数だけ * を5個ごと改行しながら表示 int n = 0; for (int i = n; n <= 0;){ System.out.print("何個*を表示しますか : "); n = stdIn.nextInt(); } for (int i = 1; i <= n; i++){ System.out.print("*"); if (n % 5 == 0) System.out.println(); } ------------------------------------------------

    • ベストアンサー
    • Java
  • for文について

    for文を使って、以下のような図形を作成してますが、 どうしてもうまく作れません。 どなたか教えていただけないでしょうか? 現在出来ているソースは次のようです。 まるで異なる図形になってしまいますが。 public class kurikaeshi { public static void main(String[] args) { int i = 0, j = 0, k = 0, l=0; for(i = 0; i < 10; i++) { for(j = 0; j < i + 1; j++) { for(k = 0; k < 2*j; k++) { System.out.print(" "); } for(l = 0; l < (2*i + 1) - 2*k; l++) { System.out.print("*"); } System.out.println(); } } } } + +++ + +++++ +++ + +++++++ +++++ +++ + +++++++++ +++++++ +++++ +++ + +++++++++++ +++++++++ +++++++ +++++ +++ +

  • for文の利用について

    for文を使って、以下のような図形を作成してますが、 どうしてもうまく作れません。 どなたか教えていただけないでしょうか? 現在出来ているソースは次のようです。 まるで異なる図形になってしまいますが。 public class kurikaeshi { public static void main(String[] args) { int i = 0, j = 0, k = 0, l=0; for(i = 0; i < 10; i++) { for(j = 0; j < i + 1; j++) { for(k = 0; k < 2*j; k++) { System.out.print("a"); } for(l = 0; l < (2*i + 1) - 2*k; l++) { System.out.print("*"); } System.out.println(); } } } } + +++ aa+ +++++ aa+++ aaaa+ +++++++ aa+++++ aaaa+++ aaaaaa+ +++++++++ aa+++++++ aaaa+++++ aaaaaa+++ aaaaaaaa+ +++++++++++ aa+++++++++ aaaa+++++++ aaaaaa+++++ aaaaaaaa+++ aaaaaaaaaa+

    • ベストアンサー
    • Java
  • Java for文 だけで逆ピラミッドを作る

    教えてください。 for 文だけで逆ピラミッドを作りたいのですが、*の数が2個ずつ減ればピラミッド 作成なのですが、私の文だと*は1個ずつしか減りません。 2個の指定はどのうように記述すればよいでしょうか? *を3と指定した場合 ***** (5) -***   (3) --*     (1) と表示したいのですが、下の文だと ***** (5) -****  (4) --***   (3) となってしまいます。 import java.io.*; class Sample4 { public static void main(String [] args) throws IOException { System.out.println("いくつ*を入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); int j =0; int i =0; int s =0; //行数制御 for(i=0; i<num; i++) { for(s=0; s<i; s++) { System.out.print("-"); } for(j=num*2-1; j>i; j--) { System.out.print("*"); //System.out.print("d"); } //改行タグ System.out.print("\n"); } } }

  • 多次元配列について質問

    以下は、Javaの参考書に掲載されていたある問題です。 その問題文と解答ソースコードを記載しますので、以下の疑問点に答えていただければ幸いです。 また、僭越ながらお願いがあるのですが、このソースコードを一度実行してから私の質問を見たほうが、より私の疑問点が回答者様にわかると思うので、実行してくだされば幸いです。 問題文:次のA~Cの手順に従ってプログラムを作成しなさい。 A:5×4の2次元配列のint型配列pを作成します。つまり、pは5個の要素を持ち、各要素が「4つの要素を持つintの配列」であるような配列です。 B:次にpの全要素にMath.random()で得られる乱数値を代入しなさい。乱数値は0から10の範囲になるように10倍し、さらにintにキャストして配列の要素に代入しなさい。 C:pの全ての要素を例示のように表示しなさい。(※ここでいう「例示」とは、私がこの質問板にupした画像のこと)ただし、pの各要素を5×4の表と見た時、各列の(縦方向の並び)の合計を、その5×4の表と見た時、各列(縦方向の並び)の合計も例示のように表示しなさい。 ---解答ソースコード(クラス宣言は除きます)--- public static void main(String[]arg){ //A int[][]p=new int[5][4]; //B for(int i=0;i<p.length;i++){ for(int j=0;j<p[i].length;j++){ p[i][j]=(int)(Math.random()*10); } } for(int[]n:p){ for(int m:n){ System.out.print(m+"\t"); } System.out.println();//改行 } //C int[]sum=new int[p[0].length]; for(int[]n:p){ for(int j=0;j<n.length;j++){ sum[j]+=n[j]; } } System.out.println(); for(int m:sum){ System.out.print(m+"\t"); } } 疑問点:Cの手順の解答について疑問なのですが、以下のソースコードで何故各列の合計を求められるかわかりません。何故ですか?凄く頭が引きちぎれるほど考えたのですがわかりませんでした。 int[]sum=new int[p[0].length]; for(int[]n:p){ for(int j=0;j<n.length;j++){ sum[j]+=n[j]; } } だって、例えば拡張for文でpの0番目の要素を取り出して、さらにfor文でその0番目の要素の0番目、1番目、2番目、3番目をsumに累計するといったように、縦方向でなく「横方向」に合計するソースコードに僕は思えるんですよ。何故縦方向に合計できるんですか?たしかに実行すると縦方向に合計されてるので、縦方向に合計するものには間違いなのだけれど、、

    • ベストアンサー
    • Java
  • java for文、if文を使っての三角形

    例:1 23 456 78910 ・・・・・・のようにひょうじさせるプログラムを作成するのに、for文とIf文を使っての三角形を   作成したいのですが、If文の条件式が分からないのとどうしたら、上記のようなプログラムが   出来るのか教えてください。お願いします。 public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ // 行に表示させる個数を表現するための変数がないため今回、新たに変数を用意する。 int a = 1; //行の終わりを改行して1増やすための変数がないため今回、新たに変数を用意する。 int b = 1; // 1~100までの数字を用意する。 for (int i = 1; i <= 100; i++) { //変数iをSystem.out.printを使って変数iをコンソールの中に出力させる。 System.out.print(i); //System.out.println("")を使って改行する。 System.out.println(" "); //変数iに1増加して数字を順番にする。 i++; if(a <= i){ System.out.print(a);

  • for文を簡単な処理に書き変えたい

    いま、配列を作る作業をしているのですが、for文を使うと、forをいくつ書けば良いのか分からない状態です。 作ろうとしている配列が、A[X][Y]で、Xの要素数は固定で良いのですが、Yの要素数が実験のたびに変動するためです。そして、処理したいのが、この配列の各列の値を適当な値(このfor文の前に値が決まっています)を代入することです。 例えば、for文だと、Y=3のときには for(i=0;i<○;i++){ for(j=0;j<○;j++){ for(k=0;k<○;k++){ A[line][0] = C[i];//(Cという配列のi成分) A[line][1] = B[j]; A[line][2] = E[k]; } } } のように書くような内容なのですが、Yが増えると、for文も増やさないといけません。 ここで、再帰処理のような方法をつかってうまく書きたいのですが、どう書いたら良いのか分かりません。 一般的なfor文の書き換え方みたいなことでも良いので、教えて頂けませんか?宜しくお願いします。

  • 多次元配列について質問

    以下は、Javaの参考書に掲載されていたある問題です。 その問題文と解答ソースコードを記載しますので、以下の疑問点に答えていただければ幸いです。 また、僭越ながらお願いがあるのですが、このソースコードを一度実行してから私の質問を見たほうが、より私の疑問点が回答者様にわかると思うので、実行してくだされば幸いです。 問題文:次のA~Cの手順に従ってプログラムを作成しなさい。 A:5×4の2次元配列のint型配列pを作成します。つまり、pは5個の要素を持ち、各要素が「4つの要素を持つintの配列」であるような配列です。 B:次にpの全要素にMath.random()で得られる乱数値を代入しなさい。乱数値は0から10の範囲になるように10倍し、さらにintにキャストして配列の要素に代入しなさい。 C:pの全ての要素を例示のように表示しなさい。(※ここでいう「例示」とは、私がこの質問板にupした画像のこと)ただし、pの各要素を5×4の表と見た時、各列の(縦方向の並び)の合計を、その5×4の表と見た時、各列(縦方向の並び)の合計も例示のように表示しなさい。 ---解答ソースコード(クラス宣言は除きます)--- public static void main(String[]arg){ //A int[][]p=new int[5][4]; //B for(int i=0;i<p.length;i++){ for(int j=0;j<p[i].length;j++){ p[i][j]=(int)(Math.random()*10); } } for(int[]n:p){ for(int m:n){ System.out.print(m+"\t"); } System.out.println();//改行 } //C int[]sum=new int[p[0].length]; for(int[]n:p){ for(int j=0;j<n.length;j++){ sum[j]+=n[j]; } } System.out.println(); for(int m:sum){ System.out.print(m+"\t"); } } 疑問点:Cの手順の解答について疑問なのですが、以下のソースコードで何故各列の合計を求められるかわかりませんでした。しかし、前回ここで質問した際に※解答していただいた方のご教示もあり、疑問点が解決したと思います。その各列の合計が求められる理由は、以下の見解で正しいですか? int[]sum=new int[p[0].length]; for(int[]n:p){ for(int j=0;j<n.length;j++){ sum[j]+=n[j]; } } 例えば、外側の拡張for文が1回目のループに突入し且つ内側のfor文のループ制御変数jが0である場合、sum[0]にn[0](=p[0][0])が代入され、外側の拡張for文が2回目のループに突入し且つjが0である場合、sum[0]にn[0](=p[1][0])が再代入されるので、縦方向に累計されていくということでしょうか? ※ http://okwave.jp/qa/q6993760.html

    • ベストアンサー
    • Java
  • ループ処理の際、最後だけ","をつけたくない

    for(int i = 0; i < a.length; i++){ System.out.print(a[i]+","); } 配列aの要素を並べて表示する時、System.out.print中に","をつけると、配列要素の最終部にまで , がついてしまいます。(・・・・43,3,98, のように) 最後だけ "," をつけたくない場合、どのように記述すればいいのでしょうか。

    • ベストアンサー
    • Java
  • 配列の使い方がわかりません

    n=1~20 s=n(n+1)(2n+1)(3n^2+3n-1)/30 のsの結果を数表にする問題で、 n  s    n   s   1  _   11 _ 2  _  12 _ ・      ・ ・      ・ ・      ・ 10 _  20  _ というような表示をしたくて、配列を用いてしてるんですが、うまくいきません。どなたか、教えてください。 public class suuhyou{ public static void main(String[] args){ int a=0,b=0,c=0,d=0,s=0; int[] x = new int[50]; for(int n=1;n<=50;n++){ a = n; b = n + 1; c = 2 * n + 1; d = 3 * n * n + 3 * n - 1; s = a * b * c * d / 30; int x[n] = s; } for(int k=1;k<=10;k++){ System.out.print ( k + ":" + x[k] +","); System.out.print ((k+10) + ":" + x[k+10]+","); System.out.print ((k+20) + ":" + x[k+20]+","); System.out.print ((k+30) + ":" + x[k+30]+","); System.out.println((k+40) + ":" + x[k+40]); } } } 自分でやっていたら、最後はこんな風にだんだんめちゃくちゃになってしまいました。このときはnが50まででやってます。お願いします。

専門家に質問してみよう