- - PR -
多次元配列(?)の長さを取得したい場合
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-03-13 11:35
こんにちは。いつもお世話になってます。
Javaで多次元配列(厳密には”配列の配列”だが・・・)の長さ(個数)を取得したい場合 はどのようにすればいいのでしょうか? たとえば、 int[][] a = new int[20][30] とあって、 a.length とすると 20 が返って きますよね。多次元配列全体の長さ(個数)の 600 を簡単にとりたい場合はどのような記述 になりますか? やはり、遠まわしに int cnt=0; for(int i=0;i<a.length;i++) cnt+=a[i].length; ということになるのでしょうか?メソッド化しようと思ったけど次元の数が不確定じゃ、 しんどいかなぁ? やりたいことは、めちゃくちゃつまらないことですけど、少し悩んでしまいました。 [ メッセージ編集済み 編集者: maru 編集日時 2003-03-13 11:43 ] | ||||||||
|
投稿日時: 2003-03-13 13:21
こんにちは。
maruさんの書き込み(2003-03-13 11:35)より
プリミティブな型の配列の場合、均一な配列になるはずなので、
だと駄目ですかね? | ||||||||
|
投稿日時: 2003-03-13 13:24
a.length * a[0].length
こんなんじゃだめですか。。。>< | ||||||||
|
投稿日時: 2003-03-13 13:23
BBCさんと重なってしまいました^^;
| ||||||||
|
投稿日時: 2003-03-13 13:46
返答ありがとうございます。
プリミティブの型で次元数が固定ならその方法でいいのですが、クラス型であったり多次元 であたりした場合は、やはりその都度その次元にあわせてループでカウントしていくという ことになるのでしょうね。 いろんなところで配列の個数が必要な場合に、そういうカウント処理を都度書くというのは、 あまりすっきりしないなと思いまして。 やっぱり命令一発でとる方法はないのかな? | ||||||||
|
投稿日時: 2003-03-13 14:00
あんまり楽じゃないけど・・・
http://www.asahi-net.or.jp/~dp8t-asm/java/tips/MultiDimensionalArrayClone.html これでやってるみたいに、「instanceof Object[]」なら再帰って感じでやっていくと、次元数や型にとらわれずに数えられないですかね? | ||||||||
|
投稿日時: 2003-03-13 14:38
はじめまして
>int[][] a = new int[20][30] のようにプリミティブ型で均一な配列の場合はやはり >a.length * a[0].length でいいような気もしますが int[] a = new int[2]; int[][] b = { {0,1,2}, a}; のような場合も考慮するとやはりmaruさんの方法しか無いような気がします。 | ||||||||
|
投稿日時: 2003-03-13 14:46
unibon です。こんにちわ。
すこし本論からズレるかもしれませんが、 完全に多次元配列として扱いたいならば、 配列の配列ではなく、配列(1次元配列)だけを使って、 int[] a = new int[20 * 30]; int b = a[y * 30 + x]; のように要素のアクセスに掛け算を使うようにしたほうが良いかも、と思います。 これは、配列の配列は、文字通り、配列の配列であり(笑)、多次元配列でないこと、 と、あと、配列の配列としてアクセスするよりは、 掛け算を使ってアクセスしたほうが速いかもしれない、と思うからです。 なお、こうすれば、もとのご質問に対する答えは a.length です、と単純になり、 こういった点はメリットと言えると思います。 ただ、こうするとコーディング間違いが起きやすくなるので、 ラップ(wrap)するクラスを作って、getter/setter メソッドを使う必要が出てくるかもしれません。 そうなると、コストが犠牲になって本末転倒気味になりますが、 でも、配列の配列を使うよりは自然かも、とも思います。 | ||||||||
