не удается создать массив связанных списков в java ...?

<p>я работаю над классом разреженной матрицы, который <strong>нуждается</strong>, чтобы использовать массив <code>linkedlist</code> для хранения значений матрицы. каждый элемент массива (т.е. каждый <code>linkedlist</code>) представляет собой строку матрицы. и каждый элемент в массиве <code>linkedlist</code> представляет столбец и сохраненное значение.</p><p>в моем классе у меня есть объявление массива как:</p><pre><code>private linkedlist<integernode>[] mymatrix; </code></pre><p>и в моем конструкторе для <code>sparsematrix</code> я пытаюсь определить:</p><pre><code>mymatrix = new linkedlist<integernode>[numrows]; </code></pre><p>я получаю ошибку</p><blockquote> <p>невозможно создать универсальный массив <code>linkedlist<integernode></code>.</p> </blockquote><p>итак, у меня есть две проблемы с этим:</p><ol> <li>что я делаю не так и</li> <li>почему тип приемлем в объявлении для массива, если он не может быть создан?</li> </ol><p><code>integernode</code> - это класс, который я создал. и все мои файлы классов упакованы вместе.</p>

<p>вы не можете использовать создание универсального массива. это недостаток/особенность универсальных java.</p><p>способы без предупреждений:</p><ol> <li> <p>использование списка списков вместо массива списков:</p> <pre><code>list< list<integernode>> nodelists = new linkedlist< list< integernode >>(); </code></pre></li> <li> <p>объявление специального класса для array of lists:</p> <pre><code>class integernodelist { private final list< integernode > nodes; } </code></pre></li> </ol>

<p>по какой-то причине вы должны привести тип и сделать объявление следующим образом:</p><pre><code>mymatrix = (linkedlist<integernode>[]) new linkedlist<?>[numrows]; </code></pre>

<p>помимо проблем с синтаксисом, мне кажется странным использовать массив и связанный список для представления матрицы. чтобы иметь возможность доступа к произвольным ячейкам матрицы, вам, вероятно, понадобится фактический массив или хотя бы <code>arraylist</code> для хранения строк, так как <code>linkedlist</code> должен пройти весь список от первого элемента до любого конкретного элемента, операции <code>o(n)</code>, в отличие от намного быстрее <code>o(1)</code> с <code>arraylist</code> или фактическим массивом.</p><p>поскольку вы упомянули, что эта матрица является разреженной, возможно, лучший способ хранения данных - это карта карт, где ключ на первой карте представляет индекс строки, а его значение - карта строки, ключи которой - индекс столбца. со значением, являющимся вашим классом integernode. таким образом:</p><pre><code>private map<integer, map<integer, integernode>> mymatrix = new hashmap<integer, map<integer, integernode>>(); // access a matrix cell: int rowidx = 100; int colidx = 30; map<integer, integernode> row = mymatrix.get(rowidx); // if null, create and add to matrix integernode node = row.get(colidx); // possibly null </code></pre><p>если вам нужно иметь возможность обходить матрицу строка за строкой, вы можете сделать тип карты строк <code>treemap</code>, и то же самое для обхода столбцов в порядке индекса, но если вам не нужны эти случаи, <code>hashmap</code> быстрее, чем <code>treemap</code>. конечно, были бы полезны вспомогательные методы для получения и установки произвольной ячейки, обрабатывающие неустановленные нулевые значения.</p>

<pre><code>class integernodelist extends linkedlist<integernode> {} integernodelist[] mymatrix = new integernodelist[numrows]; </code></pre>

<blockquote> <p><code>mymatrix = (linkedlist<integernode>[]) new linkedlist[numrows];</code></p> </blockquote><p>кастинг таким образом работает, но все же оставляет вас с неприятным предупреждением:</p><p>"безопасность типов: выражение типа list [] нуждается в непроверенном преобразовании .."</p><blockquote> <p>объявление специального класса для array of lists:</p> <p><code>class integernodelist { private final list< integernode > nodes; }</code></p> </blockquote><p>это умная идея, чтобы избежать предупреждения. может быть, немного лучше использовать интерфейс для этого:</p><pre><code>public interface integernodelist extends list<integernode> {} </code></pre><p>затем</p><pre><code>list<integernode>[] mymatrix = new integernodelist[numrows]; </code></pre><p>компилируется без предупреждений.</p><p>выглядит не так уж плохо, не так ли?</p>

<p>в java 1.5 нет создания универсального массива (или, насколько я могу судить, 1.6). смотрите <a href="https://community.oracle.com/message/4829402">https://community.oracle.com/message/4829402</a> .</p>

<pre><code>list<string>[] lst = new list[2]; lst[0] = new linkedlist<string>(); lst[1] = new linkedlist<string>(); </code></pre><p>никаких предупреждений. netbeans 6.9.1, jdk1.6.0\_24</p>

<p>вам нужен массив list, одна из альтернатив - попробовать:</p><pre><code>private integernode[] node\_array = new integernode[sizeofyourchoice]; </code></pre><p>затем <code>node\_array[i]</code> сохраняет головной (первый) узел <code>arraylist<integernode></code> или <code>linkedlist<integernode></code> (независимо от того, какая ваша реализация списка избранного).</p><p>при такой схеме вы теряете метод произвольного доступа <code>list.get(index)</code>, но тогда вы все равно можете просматривать список, начиная с хранилища узлов/кулаков в массиве типа safe.</p><p>это может быть приемлемым выбором дизайна в зависимости от вашего варианта использования. например, я использую этот дизайн для представления списка смежности графа, в большинстве случаев он требует обхода списка смежности в любом случае для данной вершины вместо произвольного доступа к какой-либо вершине в списке.</p>

<p>если я сделаю следующее, я получу сообщение об ошибке</p><pre><code>linkedlist<node>[] matrix = new linkedlist<node>[5]; </code></pre><p>но если я просто удаляю тип списка в объявлении, он, кажется, обладает желаемой функциональностью.</p><pre><code>linkedlist<node>[] matrix = new linkedlist[5]; </code></pre><p>эти две декларации кардинально отличаются от того, о чем я не знаю?</p><p><strong>редактировать</strong></p><p>ах, я думаю, что столкнулся с этой проблемой сейчас.</p><p>итерации по матрице и инициализация списков в цикле for, похоже, работают. хотя он не так идеален, как другие предлагаемые решения.</p><pre><code>for(int i=0; i < matrix.length; i++){ matrix[i] = new linkedlist<>(); } </code></pre>