3

私は論文からアルゴリズムを実装することに取り組んでいます。この論文では、グリッドの使用について説明しています。各グリッド スクエアは、そのグリッド スクエア内のオブジェクトを表す整数のリンク リストを保持します。

を使用してこれを実装することにしましLinkedList<Integer>[][]たが、もちろんgeneric array creationエラーが発生します。

リンクされたリストのグリッドのアイデアを表現するより良い方法は思いつきません。また、使用するとコンパイルされることも理解していLinkedList[][]ますが、型付けされていないため、悪い習慣です。ただし、ArrayList<ArrayList<LinkedList<Integer>>>少なくとも私には判読できないため、使用しないことをお勧めします。

ここで型なしを使用する方法はありLinkedListますか? それとも他の解決策でしょうか?

4

7 に答える 7

5

リストバージョン

List<List<List<Integer>>> grid;

読めないわけではありません。グリッドスクエアにアクセスするには、

List<Integer> items = grid.get(x).get(y);

ブレーンにはそれほど厳しいものではありません。

于 2013-01-14T19:55:07.017 に答える
2

ボヘミアンの答えは的を射ています。Guavaを使用している場合、考えられる代替手段はArrayTable<Integer, Integer, List<Integer>>. ドキュメントから:

Table2 次元配列に基づく固定サイズの実装。

テーブルの作成時に、許可された行キーと列キーを指定する必要があります。テーブルには、すべての行キーと列のペアのマッピングが常に含まれています。別の値が提供されない限り、特定の行と列に対応する値は null です。

テーブルのサイズは一定で、提供された行キーの数と提供された列キーの数の積です。remove メソッドと clear メソッドは、テーブルまたはそのビューではサポートされていません。および メソッドを代わりに使用できますerase(java.lang.Object, java.lang.Object)eraseAll()

使用例を次に示します。

private static final int NUM_ROWS = 20; //for example
private static final int NUM_COLS = 20; //

private static final ArrayTable<Integer, Integer, List<Integer>> TABLE =
        ArrayTable.create(
                Ranges.closed(1, NUM_ROWS).asSet(DiscreteDomains.integers()),
                Ranges.closed(1, NUM_COLS).asSet(DiscreteDomains.integers())
        );

public static List<Integer> getGridQuareList(int row, int col) {
    @Nullable List<Integer> list = TABLE.at(row, col);
    if (list == null) {
        list = Lists.newArrayList(); //or newLinkedList() if you insist
        TABLE.set(row, col, list);
    }
    return list;
}
于 2013-01-14T20:14:05.173 に答える
1

埋め込まれたArrayList/を使用しLinkedListます。それらが持つジェネリック型の種類がわかっているので、それをクリーンアップするためにできることは、それらを他のクラス内にラップすることです。そのようです:

public class Grid {
    private List<List<List<Object>>> inner;

    public List<Object> objectsAtPosition(int x, int y) {
        return inner.get(x).get(y);
    }

    // etc
}
于 2013-01-14T19:59:01.377 に答える
1

なぜ地球上で 3 次元リストが必要になるのかわかりません (ArrayLists が実際には 3 次元リスト/配列であることを考えると、リストの 2 次元配列)。しかし、それが必要な場合、@Bohemian が書いたものを使用する必要があります。

List<List<List<Integer>>> grid;

考慮すべきこと:

実装ではなくインターフェースに変数を宣言します。例:

List<Integer> list = new ArrayList<Integer>

それ以外の

ArrayList<Integer> list = new ArrayList<Integer>

また、一般的に、ジェネリックと配列を混在させることはお勧めできません。厄介なことになる可能性があります。Javaでそれをしたくない場合は、他の人が述べたように、Javaの方法でそれを行う必要があります:

List<List<List<Integer>>>
于 2013-01-14T20:04:56.950 に答える
0

最初: おそらく LinkedList を避けることができます。アルゴリズムの本では、ArrayList、Linked List が動的リストの同義語であることを知りませんでした。
ほとんどの場合、ArrayList の方が高速であり、特に 2D 配列の場合は必要なメモリがはるかに少なくなります。

個人的には、動的コンテンツを含む固定グリッドを使用する場合は、配列を使用します。

List grid[][];

// init with
grid = new ArrayList[numX][numY];

そうすれば、オブジェクトのグリッドがあります。これにより、使用するメモリがはるかに少なくなります。

そうすれば、オブジェクトを追加するときに非常に便利です:

 List list = grid[i][j];
 if (list == null) {
      list = new ArrayList();
      this.cells[i][j] = list;
 }
 list.add(obj);
于 2013-01-14T19:52:10.267 に答える
0

LinkedList[][] を使用してこれを実装することにしましたが、もちろん一般的な配列作成エラーが発生します。

リンクされたリストのグリッドのアイデアを表現するより良い方法は思いつきません。LinkedList[][] を使用するとコンパイルされることも理解していますが、型指定されていないため悪い習慣です。

単純。これらの問題を解決するには、

LinkedList<Integer>[][] grid = (LinkedList<Integer>[][])new LinkedList<?>[5][3];
于 2013-01-15T00:52:24.460 に答える