- PR -

多次元配列(?)の長さを取得したい場合

投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 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 ]
BBC
常連さん
会議室デビュー日: 2002/03/15
投稿数: 37
お住まい・勤務地: 東京
投稿日時: 2003-03-13 13:21
こんにちは。

maruさんの書き込み(2003-03-13 11:35)より
引用:

やはり、遠まわしに
int cnt=0;
for(int i=0;i<a.length;i++)
cnt+=a[i].length;

ということになるのでしょうか?



プリミティブな型の配列の場合、均一な配列になるはずなので、
コード:
int getArraySpace(int[][] array) {
 int i = array.getLength
 int j = array[0].getLength
 return i * j;
}


だと駄目ですかね?
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-03-13 13:24
a.length * a[0].length

こんなんじゃだめですか。。。><
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-03-13 13:23
BBCさんと重なってしまいました^^;
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-03-13 13:46
返答ありがとうございます。

プリミティブの型で次元数が固定ならその方法でいいのですが、クラス型であったり多次元
であたりした場合は、やはりその都度その次元にあわせてループでカウントしていくという
ことになるのでしょうね。
いろんなところで配列の個数が必要な場合に、そういうカウント処理を都度書くというのは、
あまりすっきりしないなと思いまして。
やっぱり命令一発でとる方法はないのかな?
jack_pma
常連さん
会議室デビュー日: 2002/11/15
投稿数: 35
お住まい・勤務地: 埼玉
投稿日時: 2003-03-13 14:00
あんまり楽じゃないけど・・・
http://www.asahi-net.or.jp/~dp8t-asm/java/tips/MultiDimensionalArrayClone.html
これでやってるみたいに、「instanceof Object[]」なら再帰って感じでやっていくと、次元数や型にとらわれずに数えられないですかね?
R-55
常連さん
会議室デビュー日: 2003/03/13
投稿数: 29
投稿日時: 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さんの方法しか無いような気がします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-03-13 14:46
unibon です。こんにちわ。

引用:

maruさんの書き込み (2003-03-13 11:35) より:
たとえば、 int[][] a = new int[20][30] とあって、 a.length とすると 20 が返って
きますよね。多次元配列全体の長さ(個数)の 600 を簡単にとりたい場合はどのような記述
になりますか?


すこし本論からズレるかもしれませんが、
完全に多次元配列として扱いたいならば、
配列の配列ではなく、配列(1次元配列)だけを使って、

int[] a = new int[20 * 30];
int b = a[y * 30 + x];

のように要素のアクセスに掛け算を使うようにしたほうが良いかも、と思います。
これは、配列の配列は、文字通り、配列の配列であり(笑)、多次元配列でないこと、
と、あと、配列の配列としてアクセスするよりは、
掛け算を使ってアクセスしたほうが速いかもしれない、と思うからです。

なお、こうすれば、もとのご質問に対する答えは a.length です、と単純になり、
こういった点はメリットと言えると思います。

ただ、こうするとコーディング間違いが起きやすくなるので、
ラップ(wrap)するクラスを作って、getter/setter メソッドを使う必要が出てくるかもしれません。
そうなると、コストが犠牲になって本末転倒気味になりますが、
でも、配列の配列を使うよりは自然かも、とも思います。

スキルアップ/キャリアアップ(JOB@IT)