2009-03-26 4 views
3

2次元配列のものを実装したいと思います。2次元配列をJavaで実装するのに最も適したデータ構造は何ですか?

これにはどのようなデータ構造が最適でしょうか?配列またはその他のデータ構造が行います。私の要件を満たす他のデータ構造があれば教えてください。

2次元配列をプログラムの早い段階で宣言する必要があるため、配列を使用したくないですが固定されていません。サイズは実行時に決定されます。

また、行数は列数と同じです。同じ名前が行と列の両方に与えられるため、これは修正されています。

また、この2-Dデータ構造を通り抜けて、マップを通過したいと思っています。

+1

のような地図を使用することができ、してみてくださいあなたの質問の表現を改善し、2Dデータ構造の使い方を示すサンプルコードを追加することができます。 –

+0

@ヤング:私はあなたの質問を言い換えようとしました。あなたの意味が間違っていると思ったら、もう一度編集してください。 –

答えて

0

アレイは実行時にサイズ変更することができます。あまり頻繁に変化しない行/列のサイズがあり、そのデータがあまり疎でない場合は、配列が最適です。

class TwoDimArray { 
    public int[][] createArray(int nRows, int nCols) { 
     return new int[nRows][nCols]; 
    } 
    public int[][] resizeArray(int[][] oldArray, int nRows, int nCols) { 
     int[][] newArray = new int[nRows][nCols]; 
     for (int i=0; i<Math.min(oldArray.length, nRows); ++i) 
      for (int j=0; j<Math.min(oldArray[i].length, nCols); ++j) 
       newArray[i][j] = oldArray[i][j]; 
     return newArray; 
    } 
} 
+0

プログラムをありがとう。それは間違いなく助けられました.. – AGeek

+0

私はこのようにしたいと思います...後でマップすることができる各行と列に名前が必要です。Javaのマップデータ構造にキーがあるので。ユーティリティパッケージ...他の方法がありますか? – AGeek

1

(編集コメントに基づく)

サイズは問題ではありません実行時に決定された場合。これはうまくいくかもしれません:

final int[][]    data; 
final int     size; 
final Map<String, Integer> names; 

// code that sets the size variable 
names = new HashMap<String, Integer>(); 
data = new int[size][size]; 

names.put("ID-A", 0); 
names.put("ID-B", 1); 

data[names.get("ID-A")][names.get("ID-A")] = 39; 
data[names.get("ID-A")][names.get("ID-B")] = 40; 
data[names.get("ID-B")][names.get("ID-A")] = 41; 
data[names.get("ID-B")][names.get("ID-B")] = 42; 
+0

okk、私vlはこれだけを試してみてください.. – AGeek

+0

これを好きにしておきたいです...それぞれの行と列には後でマップすることができる名前。Java.utilパッケージのMapデータ構造にキーがあるので...他の方法がありますか... – AGeek

6

あなたは、行キー、colキー、そしてその位置の値を使用するように思えます。あなたのためにそれを行う組み込みのデータ構造はありません。

最も簡単なものは、実際のデータの2次元配列です。行や列名から配列内の実際のインデックスに移動するには、次のようなものを使用します。必要に応じて、多くの名前からインデックスへのバインディングを追加します。あなたはクリーナーAPIをしたい場合

次にグリッドにその値を取得
Map<String, Integer> rows = new HashMap<String, Integer>(); 
Map<String, Integer> cols = new HashMap<String, Integer>(); 

...

grid[rows.get("Row name")][cols.get("Column name")]; 

はクラスでグリッドとget(String rowName, String colName)方法を置きます。

編集:質問が更新されていて、名前とインデックスのペアが行と列の両方で同じように見えます。だからここに更新されたバージョンです:

class SquareMap<V> { 
    private V[][] grid; 
    private Map<String, Integer> indexes; 

    public SquareMap(int size) { 
     grid = (V[][]) new Object[size][size]; 
     indexes = new HashMap<String, Integer>(); 
    } 

    public void setIndex(String name, int index) { 
     indexes.put(name, index); 
    } 

    public void set(String row, String col, V value) { 
     grid[indexes.get(row)][indexes.get(col)] = value; 
    } 
    public V get(String row, String col) { 
     return grid[indexes.get(row)][indexes.get(col)]; 
    } 
} 
+0

urプログラムの背後にあるアイデアは、よりクリーンで効率的に見えます。しかし、私はGridoの使用を抑制していません...私のプログラムでこのグリッドを使用していますか... – AGeek

+0

こんにちは、私はこのグリッドの機能を教えてください...グリッドは何ですか、私はどのようにそれに価値を格納することができます... – AGeek

0

あなたはちょうどそれが与えられた答えに満足できない場合は...あなたが本当に何をしたいのか伝えることはかなり難しい

class TwoDArray<V> implements Iterable<Map.Entry<Point, V>> { 
    private final Map<Point, V> map = new LinkedHashMap<Point, V>(); 
    public V set(int x, int y, V value) { 
     return map.put(new Point(x,y), value); 
    } 
    public V get(int x, int y) { 
     return map.get(new Point(x, y)); 
    } 
    public Iterator<Map.Entry<Point, V>> iterator() { 
     return map.entrySet().iterator(); 
    } 
} 

// to iterate 
TwoDArray<Double> twoDArray = new TwoDArray(); 
twoDArray.set(3, 5, 56.0); 
twoDArray.set(-1000, 5, 123.4); 
twoDArray.set(789, -100000000, -156.9); 
for(Map.Entry<Point, Double> entry: twoDArray) { 
    // 
} 
関連する問題