- PR -

配列のメモリ確保について

1
投稿者投稿内容
くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 2005-12-24 13:01
こんにちわ。いつも勉強させていただいています。

2次元配列の動的なメモリ確保についての質問です。

2次元配列に値を入れるときに
1、2、3
4、5
6、7、8、9
10、11、12、13、14、15

のように、i行目に格納されるデータの数が、最初は分からない時にはどのようにメモリを確保するのがベストでしょか?

現状では、i行目に格納される最大のデータ長で1次元配列を用意し、
1次元配列に値を入れながら、長さもカウントして、
2次元配列に格納しなおすという事をしていますが、もっとうまい方法はありますか?

リストは動作速度が遅くなるので、配列でお願いします。
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-12-24 13:18
引用:

ジュンさんの書き込み (2005-12-24 13:01) より:

現状では、i行目に格納される最大のデータ長で1次元配列を用意し、
1次元配列に値を入れながら、長さもカウントして、
2次元配列に格納しなおすという事をしていますが、もっとうまい方法はありますか?


いちいちそんなことをするより、素直にListを使ったほうが良さそうなんですが(^_^;
ArrayListがまさにそのようなことをしているので、書き直す必要を感じません。

最初からすべての値がわかってるなら
コード:
int[][] array = {
  {1,2,3},{4,5},{6,7,8,9},{10,11,12,13,14,15}
};


でもちろんいいわけですが、
i行目(って ?)の要素数(array[i].length)も、全部で何行あるか(array.length)もわからない時は
「とりあえず最低限のサイズを確保しておいて、足りなくなったら随時サイズを変更して新しい領域にコピー」
というのが定石ですね。ArrayListのソースとかを参考にしてみてください。

あ、もしかして array[0].length == array[1].length (以下すべてのiに適用) でなければいけない、とか勘違いしてます ?
くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 2005-12-24 14:16
書き込みありがとうございます。

まさにArrayListの機能の事です(^^)

PC上で動作させるだけなら、ArrayListで問題ないのですが、
最終的にモバイルにプログラムを載せたいため、
APIサポートされていなくて使えないというのを避けたいため配列で操作しています。
しかし、可読性が悪いと言いますか、妙な感じがして、うまい方法がないかと質問しました。


かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-24 16:37
System#arraycopyを使うのがいいでしょうね。
びしばしさんも仰るように、一定の量を確保し、
一定の閾値を超えた段階で自動的に拡大するというのがセオリーです。

ArrayListやStringBufferのコードが参考になると思います。
StringBufferはcharの動的配列みたいなもので、
サイズ拡大などの方法は非常に参考になります。

注意する点は、
・拡大には一定のコストがかかるため、頻繁には行わない
・System.arraycopyはディープコピーが行われない

引用:

リストは動作速度が遅くなるので、配列でお願いします。


ちなみに、リスト操作が配列に比べ遅いということは、
一概には言えません。メモリは多少食いますが。
くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 2005-12-25 15:37
返事が遅くなりすいません。

ArrayList、StringBufferのソースを参考に
一定の閾値を超えた時点で自動的に拡大するようにしました。

みなさんありがとうございました。
1

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