無名配列の作成方法についての疑問

このQ&Aのポイント
  • Javaの参考書に掲載されていた無名配列を作成するソースコードについての疑問
  • 無名配列の作成方法についての異なる書き方とその解説についての疑問
  • 無名配列とは何かについての疑問
回答を見る
  • ベストアンサー

無名配列の作成方法について質問

以下はJavaの参考書の問題集に掲載されていた、無名配列を作成するソースコードです。 この書き方について疑問があるので、質問させて頂きます。 int[][]n=new int[2][]; n[0]=new int[3]; このn[0]=new int[3];が、無名配列を使って要素に値を設定していると解説に書かれていました。 しかし、この参考書では、別のページで無名配列の作成方法として、int[]n; n=new int[]{1,2,5};のように、要素リストを代入する書き方が、無名配列の例として 紹介されていました。。 質問1:何故、n[0]=new int[3];の書き方も無名配列なのですか? 質問2:そもそも「無名配列」とは何ですか?参考書にもネットで調べても その解説がほとんど無かったので、、、

  • Java
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • axsies
  • ベストアンサー率64% (38/59)
回答No.2

無名配列という言葉で検索すると、もっとヒットするのはPerlのものですね。 Perlは標準的には、配列は配列名とセットでないと定義できないのですが、 名前無しでも定義する文法があって、それを無名配列と呼びます。 Perlで多次元配列を使いたいとき、この無名配列という仕様が関わってくるのですが、 どうもこの辺から、その参考書の筆者は元Perl使いで、Perlの用語をJavaでも混同して使っているというのが真相な気がしてなりません。 (Perlと比較して考えると、そもそもJavaの配列は全て無名配列です。) 無名○○という用語は、普通は名前を付けなければ定義できないけれど、 特別に名前無しでも定義する方法がある。というとき、前者と区別するために、無名○○とか、匿名○○と呼ぶことが多いです。 (メソッドは通常名前無しでは定義できませんが、C#とかJavaScriptでは名前無しで定義する方法があり、それを匿名メソッドとか呼ばれます。) Javaには無名クラスという、クラス名を付けずにクラスを定義できる仕様がありますが、こっちは一般的な用語です。 とりあえず「無名配列」は一般的な用語でもないですし、上の話は理解できなくても重要な事は何一つないので、特に気にせず先に進むのがベストでしょう。

wantanton
質問者

お礼

丁重なご解答誠にありがとうございます! あまり気にしないようにします!

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「問題集」に「無名配列」と出ているなら, その「Javaの参考書」ないし「Javaの参考書の問題集」に「無名配列」なるものの説明があるはずです. それを見てください. もし全く説明されていないなら, それはその本の (著者の) 怠慢というべきでしょう. 一般論的には名前があるかどうかなんて関係ないというか, 「名前がないとそもそもアクセスしようがない」というか....

wantanton
質問者

お礼

丁重なご解答誠にありがとうございます! 参考になります! 無名配列について、解説されたものが他のページにないかどうか再度探してみます!

関連するQ&A

  • 多次元配列への数値の代入。

    こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 多次元配列について質問

    以下は、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
  • 配列について質問です。

    学校で以下のような内容のプログラムを組む課題が出されました。 「数を格納した配列の各要素の和を出力せよ。」 一応組むことはできたのですが、引っかかることがあります。 私が組んだのは下のような要素の個数は引数で定義、 各要素は標準入力で読み込むというものです。 import java.io.*; class main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); int n =Integer.parseInt(args[0]); int[] a = new int[n]; for(int i=0;i<n;i++){ a[i] = Integer.parseInt(br.readLine()); } int b=0; for(int i=0;i<n;i++){ b+=a[i]; } System.out.println("sum = "+b); } } ここで質問なのですが、仮に引数で5と入力すると 配列a[]はa[0]~a[5]の計6個できると思うんです。 でも、実行してみると要素数はa[4]の5個までしかできず、 最後のa[5]はどこに行ったのだろう?というものです。

    • ベストアンサー
    • Java
  • 多次元配列について質問

    以下は、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
  • 非常にはずかしい質問ですが 配列の質問です。

    C言語の勉強で時間が経つごとに、肝心の基礎が忘れがちになるのですよね。 それに、配列に対しての説明ってほとんど文字列ばかりで整数はみつからないです。 今回の質問は ・int型配列の要素ひとつずつ代入するにはどうするか? ・同じ数字を代入させないにはどうするか? ・配列中n個の要素を表示させるにはどうするのか? 条件 1、配列の要素はn個 2、同じ数は× 一応かいてみました。 { int buffer[6], i, j, signal ; srand((unsigned int)time(NULL)); for( i = 0 ; i < 6 ; i++){ buffer[i] = rand()%42+1; for( signal = 0 , j = 0 ; j < i ; j++ ){ if(buffer[i] == buffer[j]){signal = 1; break;} } if(signal == 0){break;} } printf("%d\n",buffer);

  • 配列について質問です。(訂正版)

    学校で以下のような内容のプログラムを組む課題が出されました。 「数を格納した配列の各要素の和を出力せよ。」 一応組むことはできたのですが、引っかかることがあります。 私が組んだのは下のような要素の個数は引数で定義、 各要素は標準入力で読み込むというものです。 import java.io.*; class main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); int n =Integer.parseInt(args[0]); int[] a = new int[n]; for(int i=0;i<n;i++){ a[i] = Integer.parseInt(br.readLine()); } int b=0; for(int i=0;i<n;i++){ b+=a[i]; } System.out.println("sum = "+b); } } ここで質問なのですが、要素数を5個にしたいので 引数で5と入力すると配列a[]はa[0]~a[5]の 計6個できると思うんです。ですから、7行目で int[] a = new int[n-1]; として要素数を5個にしたんですがこれだと5個目の読み込みでエラーになります。 なぜなんでしょうか? 長々とした文章ですみません。。。

    • ベストアンサー
    • Java
  • 配列の頭に要素を挿入する方法

    初心者です。配列でご教授お願いします。 インデックス0からひとつずつ要素をずらして、配列の一番前に要素を挿入するにはどうしたらいいのでしょうか? int[] a = new int[10]; int n = a.length; for (int i = n-1; i < 1; i--){ a[i] = a[i-1]; } a[0] = 新しい要素 といった感じで書いたのですが、どうもループの中が実行されていないようなのです。 よろしくお願いいたします。

  • 無名配列からハッシュを作りたいのですが・・・

    $VAR1 = [ 'No', 'a', 'i', 'u', 'e', 'o', ]; #VAR1と同じ数の<>区切りの下記のようなデータを読み込み配列に代入 --List----------------------- 1<>あ<>い<>う<>え<>お<> ------------------------- foreach(0..$#List){ @Array=split(/<>/,$List[$_]); } 最終的なイメージは print "$a{No}"; >1 print "$a{a}"; >a となるよう、上記VAR1の無名配列の値をキーに、読み込んだ<>区切りのデータを関連付けて表示させるようにしたいのです。 foreach my$var(@$VAR1){ ...ここをどうすれば配列の値をハッシュのキーとして作成出来るのか頭を悩ませてます。 } 先輩方のお知恵をお借りできませんでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 要素数が10の配列で、乱数0~9の値が重複しないようにする方法がわからなくて困っています。

    JAVAの練習問題でわからなくて困っています 以下は線形探索のプログラムで、このプログラムを改良して、 要素数が10の配列で、乱数0~9の値が重複しないようにする方法がわからなくて困っています。 以下のような簡単なプログラムでできる方法で行いたいです。 どなたか答えまたはヒントを下さい、お願いします。 ------------------------------------------------------------ import java.util.Random; import java.util.Scanner; public static void main (String[] args) { Random rand = new Random(); Scanner stdIn = new Scanner(System.in); final int n = 10; //要素数 int[] a = new int[n]; //配列を宣言 for (int j = 0; j < n;) a[j] = rand.nextInt(10); System.out.print("配列aの全要素の値\n{ "); for (int j = 0; j < n; j++) System.out.print(a[j] + " "); System.out.println("}"); System.out.print("探す数値 : "); int key = stdIn.nextInt(); int i; for (i = 0; i < n; i++) if (a[i] == key) break; if (i < n) //探索成功 System.out.println("それはa[" + i + "]にあります。"); else //探索失敗 System.out.println("それはありません。"); } }

  • 配列の問題

    配列の問題です。 n個の要素を持つ一次元配列の値(変数値)をまったく逆に入れ替えるプログラムを作りたいのですが、この場合どのようにして逆を表現すればよいのかわかりません。 (nの値は読み込み、配列は奇数個でも偶数個でも使えるプログラムでなければなりません) 参考書を見ながら作ってみたのですが…だめでした。 プログラム初心者です。アドバイスお願いします。 int main(void) { int i,n; int vc[n]; printf("n個の要素を持つ一次元配列をつくる\n"); printf("nの値を入力してください\n"); scanf("%d",&n); for (i=0;i<n+1;i++) vc[i]=i+1; for (i=0;i<5;i++) printf("vc[%d]=%d\n",i,vc[i]); printf("この配列を逆に入れ替えると\n); return 0; }

専門家に質問してみよう