2010-03-30 4 views
5

Ich möchte ein XY-Array von Ganzzahlen (oder was auch immer), aber ich möchte Methoden wie "hinzufügen", "entfernen", "enthält", "indexOf "ähnlich der ArrayList-Klasse.Java: Bidimensional Array mit Methoden/Fähigkeiten ähnlich ArrayList

Gibt es eine vorhandene Klasse mit diesen Fähigkeiten?

PS: Ich will nicht, eine Arraylist von Arraylist

+1

"Ich möchte keine ArrayList von ArrayList erstellen" Warum? Es würde tatsächlich perfekt zu Ihrer Beschreibung passen. Liegt es daran, dass Sie primitive Typen verwenden möchten? – Searles

+0

Nein. Es ist, weil ich Objekte erstellen möchte, die mehr als eine Zelle belegen, und jeder kann entweder vertikal oder horizontal sein. Wenn wir berücksichtigen, dass die ArrayList vertikal ist, würde ich Probleme mit Objekten horizontal haben, da sie verschiedene Positionen von verschiedenen ArrayLists auf einmal verwenden. –

Antwort

3

Nein, AFAIK gibt es keine Klasse wie diese. Aber Implementierung sollte man recht einfach sein:

class BiDimensionalArray<T>{ 
    Object[][] backupArray; 
    int lengthX; 
    int lengthY; 

    public BiDimensionalArray(int lengthX, int lengthY) { 
    backupArray = new Object[lengthX][lengthY]; 
    this.lengthX = lengthX; 
    this.lengthY = lengthY; 
    } 

    public void set(int x, int y, T value){ 
    backupArray[x][y] = value; 
    } 

    public T get(int x, int y){ 
    return (T) backupArray[x][y]; 
    } 

    public void addX(T[] valuesY) { 
    Object[][] newArray = new Object[lengthX+1][lengthY]; 
    System.arraycopy(backupArray, 0, newArray, 0, lengthX); 
    newArray[lengthX]=valuesY; 
    backupArray = newArray; 
    lengthX = lengthX+1; 
    } 
} 

Hinweis: Die Typeparameter ist intern nicht verwendet, weil es nicht so etwas wie new T[][]

EDITS
Added ADDx Verfahren zur Demonstration
Fixed Compile-Fehler

1

Es sind keine nativen Matrix-Typen in den Standard-Java-Bibliotheken erstellen. Davon abgesehen ist es ziemlich einfach, einen zu erstellen. Die Methoden sind trivial zu implementieren und Sie können es mit einem Array, einem List oder was auch immer unterstützen.

+0

Was erwarten Sie von 'remove'? (Und wollen Sie Ihre Argumente überprüfen?) –

+0

@Tom http://java.sun.com/javase/6/docs/api/java/util/List.html#remove(java.lang.Object) – cletus

+1

I meine 'Matrix.remove'. Erstens wird nur die erste Übereinstimmung entfernt, was bedeutet, dass Sie vom Implementierungslayout abhängig sind. Zweitens verschiebt es die verbleibenden Einträge in einer unmatrix-ähnlichen Weise und bewirkt, dass "get" merkwürdig wirft. –

1

check out JAMA, ist es von den Mathworks und NIST.

2

Von Ihrer Beschreibung würde ich vorschlagen, dass Sie versuchen, JAMA zu verwenden.
Sie können auch Ihre eigene Implementierung für eine XY-Matrix erstellen. Dazu müssen Sie jedoch entscheiden, was genau Sie von der Implementierung erwarten.
Wenn Ihre Matrix keine feste Größe hat, können Sie das 3-Tupel-Format zum Speichern von Matrizen verwenden. (Diese Darstellung ist nur effizient, wenn Ihre Matrix spärlich ist). Intern werden Sie drei ArrayLists verwenden. eine zum Speichern der Zeilennummer, eine zweite zum Speichern der Spaltennummer und die dritte zum Speichern des tatsächlichen Wertes.
Dementsprechend schreiben Sie die add(int row, int column, int value)-Methode, die sich um Dinge wie das Sortieren der ArrayLists nach Zeilennummer, dann nach Spaltennummer usw. kümmert, um die Effizienz von wahlfreien Zugriffen zu erhöhen.
Mit dieser Repräsentation können Sie alle Methoden wie remove(), implementieren, die für ArrayList verfügbar sind.