0

各要素が(特定のオブジェクトの)LinkedListに対応する大き​​な行列(n x n)を作成したいと思います。

私はどちらかができます

  1. n * n個の個別のリンクリストを作成し、両方のディメンション(または同様のもの)を繰り返すループ内でeval()を使用して名前を付けます。これにより、最終的にLinkedList_1_1、LinkedList_1_2などが作成されます。一意の変数名。基本的に、マトリックスを完全にスキップします。

  2. ArrayListsのArrayListを作成してから、各要素にリンクリストをプッシュします。

時間とスペースを節約し、個々のLinkedListを参照するときに、後のコードで簡単にアクセスできるようにする場合は、この方法をお勧めします。特定のリンクリストにアクセスするときはいつでもevalを使用する必要があるため、方法1ではアクセスのしやすさが不十分になります。

私の腸の感覚は、方法2が最善のアプローチであると教えてくれますが、どのように正確に初期化を形成するのですか?

4

1 に答える 1

1

そもそもサイズがわかっているので、配列だけを使ってみませんか?残念ながら、Javaジェネリックは、配列要素自体が具象ジェネリック型になることを防ぎますが、ワイルドカードを使用できます。

LinkedList<?>[][] lists = new LinkedList<?>[n][n];

または、メモリ内でわずかに効率的で、単一の配列のみです。

LinkedList<?>[] lists = new LinkedList<?>[n * n];

// Then for access...
lists[y * n + x] = ...;

次に、アクセスごとにキャストする必要があり@SuppressWarningsます。これは、常に機能することがわかっている場合に使用します(適切にカプセル化すると仮定します)。私はそれを一箇所に置きます:

@SuppressWarnings("unchecked")
private LinkedList<Foo> getList(int x, int y) {
    if (lists[y][x] == null) {
        lists[y][x] = new LinkedList<Foo>();
    }
    // Cast won't actually have any effect at execution time. It's
    // just to tell the compiler we know what we're doing.
    return (LinkedList<Foo>) lists[y][x];
}

もちろん、どちらの場合も、必要に応じて、空のリンクリストを配列に追加する必要があります。(リンクリストのいくつかにノードが含まれない場合は、それらを遅延して作成することだけを検討することをお勧めします。)

私は確かに何百もの変数を持つクラスを生成しません。それはリストへのプログラムによるアクセスを非常に苦痛にし、基本的に多くの点で悪い考えになります。

于 2012-12-03T06:51:26.523 に答える