Desidero utilizzare una raccolta al posto dell'array 2D in modo che non sia necessario fornire le sue dimensioni al momento della dichiarazione e posso aggiungere tutti gli elementi che desidero in modo dinamico.Quale raccolta utilizzare al posto dell'array 2D in Java?
risposta
Il problema con Elenco> è necessario ridimensionare ogni riga se si desidera ridimensionare la matrice.
Se si desidera utilizzare una matrice sparsa, o forse una matrice infinita si può fare qualcosa di simile:
class SparseMatrix<X> {
private Map<Coord, X> values = new HashMap<Coord, X>();
public SparseMatrix() {
}
public X get(int x, int y) {
return values.put(new Coord(x,y)); // null if there's no value
}
public void set(int x, int y, X value) { // you can use null (like in a List)
values.set(new Coord(x,y), value);
}
private static class Coord {
int x; int y;
public Coord(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object other) {
if (other instance of Coord) {
Coord o = (Coord) other;
return o.x == x && o.y == y;
}
return false;
}
@Override
public int hashCode() {
return o.x + o.y; // or some more clever implementation :)
}
}
}
Edit:Apache Commons HashCodeBuilder è un grande strumento per la generazione di hash-codici.
Il tuo hashCode potrebbe traboccare - tuttavia * lo * hai commentato di conseguenza ... :) – Esko
Vista nitida !!! C'è un metodo di utilità: java.util.Arrays.hashCode (int []) che crea un hashcode per un int [] ma, ovviamente, non sarebbe bello creare un array ogni volta che è necessario hashChode (o avere ha creato). Forse potremmo copiare la sua implementazione solo per due interi: (31 + o.x) * 31 + o.y. Ma sembra traboccare comunque ... (Penso che non importa, è ciclico?). – helios
Ha importanza nell'hashCode() che x + y == y + x? – Adam
Sto utilizzando personalmente la classe Vector per questo scopo, anche se requisiti diversi possono eventualmente dettare l'uso di altre classi più specializzate.
Il vettore è deprecato ed è stato sostituito da ArrayList. – Yoni
@mortiz - 'java.util.Vector' dovrebbe essere generalmente evitato - la sicurezza del thread non è molto utile per la maggior parte degli scenari multi-thread e aggiunge solo un sovraccarico all'utilizzo a thread singolo. La maggior parte delle persone usa invece 'ArrayList' come tipo di' Lista' predefinito. – McDowell
imparato qualcosa, grazie! – moritz
java.util.ArrayList è la mia scelta preferita.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html
Penso che sia usato quando vogliamo avere un array 1-D dinamico –
Puoi avere un ArrayList che ogni suo elemento sarebbe un altro ArrayList (come rsp e me stanno proponendo nelle nostre risposte). In questo modo, una ArrayList può essere utilizzata anche per gli array 2D. – Alex
Import java.util.ArrayList;
ArrayList
è quello che volete, non è necessario impostare le dimensioni al momento della creazione ed è possibile aggiungere gli elementi in modo dinamico utilizzando il metodo add
.
Il modo più semplice è quello di utilizzare le collezioni annidati ... diciamo (supponendo che i valori sono stringhe) List<List<String>>
che possono poi essere utilizzate in questo modo:
List<List<String>> fakeArray = new ArrayList<List<String>>();
// Pretend you fill it with values between these calls
String retrieve = fakeArray.get(0).get(0);
Edit: Questo era in origine una Map<String,List<String>>
che in realtà doesn' ha senso in questo contesto.
Tuttavia, si consiglia di vedere se Google Collections o Apache Commons Collections hanno qualcosa più specializzata che è possibile utilizzare.
Dipende da cosa si sta tentando di fare, ma vorrei raccomandare ArrayList. È più veloce del vettore. A meno che non ti interessi della sincronizzazione! Se lo si desidera come un elenco bidimensionale, quindi si crea un ArrayList e ogni elemento di questo elenco sarebbe un altro ArrayList.
È possibile eseguire una prova con un ArrayList
con ArrayList
s come elementi. Se ciò non fa ciò che vuoi, ti darà istantaneamente ciò di cui hai bisogno per costruirti.
Cosa vuoi essere in grado di fare con esso? Probabilmente userò semplicemente un Collection<Collection<Element>>
(dove Collection potrebbe essere sostituito da List).
Oppure è possibile creare la propria classe con metodi per scorrere su righe o colonne o tutti gli elementi necessari.
Dipende dal modo in cui si desidera utilizzare la struttura dati. Le opzioni disponibili sono:
- Due elenchi; è il tuo lavoro sincronizzare tra loro.
- Una mappa; invece di una relazione valore-chiave, le voci della mappa saranno semplicemente tuple di oggetti.
- Un elenco di matrici di oggetti a 2 celle; ciascun elemento della lista sarà un array oggetto di dimensioni 2.
EDIT: ho letto male completamente i questione; Pensavo si trattasse di una matrice 2D di larghezza 2.
Dopo aver letto correttamente la domanda (spero :-)), sono d'accordo con chi ha detto la lista delle liste.
- 1. Quale comando utilizzare al posto di urllib.request.urlrrispondere?
- 2. Quale raccolta Java considera le permutazioni uguali?
- 3. Quale metodo posso usare al posto di __file__ in python?
- 4. Quale ORM dovrei usare al posto di Linq su Sql?
- 5. Pathfinding gioco 2D in Java?
- 6. Modello di progettazione da utilizzare al posto dell'ereditarietà multipla
- 7. Utilizzare la classe estesa al posto della classe base
- 8. Java: quale framework di configurazione utilizzare?
- 9. Come utilizzare la chiamata di raccolta in Java 8?
- 10. Come utilizzare i valori letterali di raccolta in Java 7?
- 11. Java: serializzazione/deserializzazione da/XML al posto del binario
- 12. Sicurezza Java EE: quale metodo utilizzare?
- 13. Ruota un array 2D sul posto senza utilizzare un nuovo array: la migliore soluzione C++?
- 14. Shaders al posto di GPGPU
- 15. java Arrays.sort matrice 2D
- 16. java: restituire una raccolta
- 17. In che modo MVC3 sceglie quale ViewEngine utilizzare se ho più motori nella raccolta ViewEngines?
- 18. Grafica di gioco 2D Java
- 19. Movimento dal 2D al 3D
- 20. Cosa dovrei usare al posto di sscanf?
- 21. Diffie-Hellman al posto di SSL?
- 22. Cosa usare al posto di `qt5_use_modules`?
- 23. display Enum descrizione in jqGrid al posto del Enum
- 24. Cosa dovrei usare al posto di printf in Perl?
- 25. copiare una matrice 2d in Java
- 26. Algoritmo dijkstra per array 2D in Java
- 27. Come creare un ArrayList 2D in java?
- 28. Pretty array 2D di stampa in Java
- 29. Giochi Java 2d con Java SWING
- 30. Java: clona raccolta arbitraria tramite riferimento alla raccolta
Quali modelli si intende utilizzare per accedere agli elementi dell'array? Accesso casuale, un'intera riga, un'intera colonna? –