Ich arbeite an einer Sparse - Matrix - Klasse , die benötigt ein Array von verwenden , um LinkedList
die Werte einer Matrix zu speichern. Jedes Element des Arrays (dh jedes LinkedList
) repräsentiert eine Zeile der Matrix. Und jedes Element im LinkedList
Array repräsentiert eine Spalte und den gespeicherten Wert.
In meiner Klasse habe ich eine Deklaration des Arrays als:
private LinkedList<IntegerNode>[] myMatrix;
Und in meinem Konstruktor für SparseMatrix
versuche ich zu definieren:
myMatrix = new LinkedList<IntegerNode>[numRows];
Der Fehler, den ich am Ende bekomme, ist
Es kann kein generisches Array von erstellt werden
LinkedList<IntegerNode>
.
Ich habe also zwei Probleme damit:
- Was mache ich falsch und
- Warum ist der Typ in der Deklaration für das Array akzeptabel, wenn er nicht erstellt werden kann?
IntegerNode
ist eine Klasse, die ich erstellt habe. Und alle meine Klassendateien sind zusammen gepackt.
class IntegerNodeList extends List<IntegerNode> {}
Aus irgendeinem Grund müssen Sie den Typ umwandeln und die Deklaration wie folgt abgeben:
quelle
Abgesehen von den Syntaxproblemen erscheint es mir seltsam, ein Array und eine verknüpfte Liste zur Darstellung einer Matrix zu verwenden. Um auf beliebige Zellen der Matrix zugreifen zu können, möchten Sie wahrscheinlich, dass ein tatsächliches Array oder zumindest ein
ArrayList
die Zeilen enthält, daLinkedList
die gesamte Liste vom ersten Element zu einem bestimmten Element, einerO(n)
Operation, durchlaufen werden muss , im Gegensatz zu viel schnellerO(1)
mitArrayList
oder einem tatsächlichen Array.Da Sie erwähnt haben, dass diese Matrix spärlich ist, können Sie die Daten möglicherweise besser als Karte mit Karten speichern, wobei ein Schlüssel in der ersten Karte einen Zeilenindex darstellt und sein Wert eine Zeilenzuordnung ist, deren Schlüssel ein Spaltenindex sind , wobei der Wert Ihre IntegerNode-Klasse ist. So:
Wenn Sie in der Lage sein müssen, die Matrix zeilenweise zu durchlaufen, können Sie den Zeilenzuordnungstyp a festlegen
TreeMap
, und dasselbe gilt für das Durchlaufen der Spalten in Indexreihenfolge. Wenn Sie diese Fälle jedoch nicht benötigen,HashMap
ist dies schneller alsTreeMap
. Hilfsmethoden zum Abrufen und Festlegen einer beliebigen Zelle, die nicht festgelegte Nullwerte verarbeiten, wären natürlich nützlich.quelle
quelle
Das Casting auf diese Weise funktioniert, hinterlässt aber dennoch eine böse Warnung:
"Typensicherheit: Der Ausdruck vom Typ Liste [] muss deaktiviert konvertiert werden."
ist eine clevere Idee, um die Warnung zu vermeiden. Vielleicht ist es ein bisschen schöner, eine Schnittstelle dafür zu verwenden:
dann
Kompiliert ohne Warnungen.
sieht nicht schlecht aus, oder?
quelle
List<IntegerNode>[] myMatrix = new IntegerNodeList[numRows];
Dies hat ein subtiles, aber wichtiges Problem. Sie können nur setzenIntegerNodeList
in der Anordnung.myMatrix[i] = new ArrayList<IntegerNode>();
wird werfenArrayStoreException
.Keine Warnungen. NetBeans 6.9.1, jdk1.6.0_24
quelle
In Java 1.5 gibt es keine generische Array-Erstellung (oder 1.6, soweit ich das beurteilen kann). Siehe https://community.oracle.com/message/4829402 .
quelle
Wenn ich Folgendes tue, wird die betreffende Fehlermeldung angezeigt
Aber wenn ich nur den Listentyp in der Deklaration entferne, scheint er die gewünschte Funktionalität zu haben.
Unterscheiden sich diese beiden Erklärungen drastisch, was mir nicht bewusst ist?
BEARBEITEN
Ah, ich glaube, ich bin jetzt auf dieses Problem gestoßen.
Das Iterieren über die Matrix und das Initialisieren der Listen in einer for-Schleife scheint zu funktionieren. Obwohl es nicht so ideal ist wie einige der anderen angebotenen Lösungen.
quelle
Sie benötigen eine Reihe von Listen. Eine Alternative besteht darin, Folgendes zu versuchen:
Dann
node_array[i]
speichert den Kopf (ersten) Knoten einArrayList<IntegerNode>
oderLinkedList<IntegerNode>
(was auch immer Ihre Favoritenliste Implementierung).Bei diesem Entwurf verlieren Sie die Direktzugriffsmethode
list.get(index)
, können dann jedoch die Liste beginnend mit dem Kopf- / Faustknotenspeicher im Typ-Safe-Array durchlaufen.Dies kann je nach Anwendungsfall eine akzeptable Designwahl sein. Zum Beispiel verwende ich dieses Design, um eine Adjazenzliste eines Diagramms darzustellen. In den meisten Anwendungsfällen muss die Adjazenzliste ohnehin für einen bestimmten Scheitelpunkt durchlaufen werden, anstatt zufällig auf einen Scheitelpunkt in der Liste zuzugreifen.
quelle