- PR -

行列を表す2次元配列での列数の取得

1
投稿者投稿内容
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2003-06-04 14:13
まさです。お世話になっております。

いま、 javax.swing.JTable に使用するデータを
行と列を示す2次元配列で保持しようとしています。
(各行の列数は固定とする)

コード:
Object[][] cellData = new Object[][] {
        { "A1", "B1", "C1", },
        { "A2", "B2", "C2", },
        { "A3", "B3", "C3", },
    };




このとき、
このデータの行数は cellData.length、
列数は cellData[0].length というようにとっていたのですが、

コード:
Object[][] cellData = new Object[0][3];



このようにデータの行数が 0 のときに
この行列の列数を取得するにはどうしたらよいのでしょうか?

基本的な質問で申し訳ないのですが、
よろしくお願いします。
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-06-04 17:19
なんでそんな配列を宣言する必要があるんでしょう?
そこからして不思議なのですが・・・
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-06-04 18:06
unibon です。こんにちわ。

引用:

まささんの書き込み (2003-06-04 14:13) より:
いま、 javax.swing.JTable に使用するデータを
行と列を示す2次元配列で保持しようとしています。


JTable のコンストラクタとして、Object[][] を引数にとるもの、
http://java.sun.com/j2se/1.4/ja/docs/ja/api/javax/swing/JTable.html#JTable(java.lang.Object[][], java.lang.Object[])
を利用されているのだと推測します。
#URL に空白文字があるので、うまくスクロールしませんが。

JTable のこのコンストラクタは、簡易的なものであり、
行数が0行になることを考えていないのではないでしょうか(試していないですが)。
ちょっと面倒でも TableModel のクラスを定義して、
JTable がその TableModel を使うようにするほうが、手っ取り早いと思います。

なお、もし JTable 云々ではなく、2次元配列の問題を追求するとすれば、
過去記事の、
「多次元配列(?)の長さを取得したい場合」
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3893&forum=12
が関連するかもしれません。

#あとで JTable の API リファレンスの URL のみを訂正しました。

[ メッセージ編集済み 編集者: unibon 編集日時 2003-06-04 18:13 ]
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-06-05 10:00
こんにちは。Wataです。

引用:

まささんの書き込み (2003-06-04 14:13) より:

このようにデータの行数が 0 のときに
この行列の列数を取得するにはどうしたらよいのでしょうか?




2次元配列は配列の配列だから、
行数が0だとしたら、各行にあたる配列は存在しないわけで、
その存在しない配列の長さを取得することは不可能だと思うのですが...

コード:
int length = (cellData.length==0)?0:cellData.length;


こういう仕様じゃだめですかね...。
jack_pma
常連さん
会議室デビュー日: 2002/11/15
投稿数: 35
お住まい・勤務地: 埼玉
投稿日時: 2003-06-05 10:36
jack_pmaと申します。
こんな配列が作成可能だなんて知りませんでした。ネット上だと随分昔の言語仕様しか見つからないですが、さすがにこんなパターンには言及されていないようでした。生成時に例外が出ちゃってもいいような気がしますね(ちゃんと生成できることは確認しました)。

でも、基本的に行がないから列にはアクセスできないですし、この配列の列数を3と返してしまっても(そういうことがもしできたとしても)、かえって3列存在するものと誤認してしまって危険です(実際には列は存在しません)。
Wataさんが言うように0と考えるのがいいかと思います。

ちなみに、unibonさんが紹介してくださったスレッドで、多次元配列の要素数を数えるコードを書きましたが、あれも各要素の要素数を個別に調べていくだけなので行の要素のない配列にはやはり使えないです。

まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2003-06-05 11:36
まさです。お世話になります。
皆さん返答ありがとうございます。


unibon さん書き込みより
引用:

ちょっと面倒でも TableModel のクラスを定義して、
JTable がその TableModel を使うようにするほうが、手っ取り早いと思います。



自作の TableModel 内で配列の配列を持っています。
DefaultTableModel の Vector ではなんとなく嫌なんで…


Wata さん書き込みより
引用:

2次元配列は配列の配列だから、
行数が0だとしたら、各行にあたる配列は存在しないわけで、
その存在しない配列の長さを取得することは不可能だと思うのですが...



やはりそうなりますかねぇ?


jack_pma さん書き込みより
引用:

でも、基本的に行がないから列にはアクセスできないですし、この配列の列数を3と返してしまっても(そういうことがもしできたとしても)、かえって3列存在するものと誤認してしまって危険です(実際には列は存在しません)。



ところが、テーブルではそうは行かないんです。
行が無くても3列存在するものとして認識しないといけないんです。
テーブルのヘッダがありますからね


ということで、
データは配列の配列で持つのはいいとして、
行数・列数をこのデータ配列から取ろうという時点で
すでに間違っているようです。

あきらめて別の方法で行数・列数を取るようにします…
ありがとうございました。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-06-05 18:10
unibon です。こんにちわ。

引用:

まささんの書き込み (2003-06-04 14:13) より:

Object[][] cellData = new Object[0][3];


ちょっと蛇足になり、直接の回答ではないですが、
たまに人に Java を教える際にいつも思うことですが、
上記のような擬似2次元配列(と勝手に命名しました)の new を許す Java の文法は、
ややこしいと感じます。
#ややこしければ使わなければそれで済むのですが、
#なぜか Java の入門書には大抵これについて触れているので、
#教えざるを得なくなってしまうのが嫌なのです。
#で、使い慣れないので自分もよく分かっていない。

たとえば、要素数が 0 ではない例を考えますと、
Object[][] cellData = new Object[2][3];
は、
Object[][] cellData = new Object[2][];
for (int i = 0; i < cellData.length; i++) {
cellData[i] = new Object[3];
}
と実質的に同じです。

これの要素数が 0 の場合を考えると、
Object[][] cellData = new Object[0][3];
ですが、これは、上記のような for ループはないことと同じであり、結局は、
Object[][] cellData = new Object[0][];
と同じことのはずです。
ここで、3 という情報は失われているはずです。

要素数が 0 の配列を作ることができることは、
もちろんできて当然(0 を特別扱いされるのは非常にやりにくい)なのですが、
3 という情報が失われることについては、
この構文を(擬似ではない)2次元配列だと思ってみていると気づきにくいですよね。
したがって、そもそも、このような擬似2次元配列の new ができなければ(禁止されていれば)、
明示的に for などでループする必要があり、ループ回数をプログラム中で明示するため、
分かり(教え)易くてよいと思います(思うだけですが)。
1

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