2010-09-07 22 views
9

Se si dispone di una classe che deve restituire un array di stringhe di dimensione variabile (e tale dimensione può essere determinata solo eseguendo qualche metodo della classe), come si dichiara l'array dinamico nel costruttore della classe?Come inizializzare un array dinamico in java?

Se la domanda non era abbastanza chiaro,

in php potremmo semplicemente dichiarare un array di stringhe come $my_string_array = array(); e aggiungere elementi ad essa da $my_string_array[] = "New value";

Qual è il codice di cui sopra equivalente poi in java ?

risposta

13

Si vuole esaminare la java.util package, in particolare la classe ArrayList. Ha metodi come .add() .remove() .indexof() .contains() .toArray() e altro.

+1

Per la precisione, è in 'java.util' (insieme a tutte le altre classi di raccolta). 'java.util.Collections' (con maiuscolo C) è una classe di utilità, non un pacchetto. –

+0

@Peter good catch, ho corretto il mio post –

+0

come una domanda successiva, è anche possibile creare indici di stringhe [ad esempio: $ my_string_array ["proprietà"]]? – lock

6

Creare un List invece.

List<String> l = new LinkedList<String>(); 
l.add("foo"); 
l.add("bar"); 
+3

Per la maggior parte dei casi, un elenco di array è una scelta migliore, ma questo è il motivo per cui è sempre opportuno dichiarare la variabile utilizzando interfacce opposte alle classi (quindi è facile modificare l'implementazione sottostante). –

1

Nessuna matrice dinamica in java, la lunghezza della matrice è fissa. La struttura simile è ArrayList, un vero array è implementato alla base di esso. Vedere il nome Array Elenco :)

7

array Java Plain (cioè String[] strings) non può essere ridimensionato dinamicamente; quando sei fuori dalla stanza ma vuoi ancora aggiungere elementi al tuo array, devi crearne uno più grande e copiare l'array esistente nelle sue prime posizioni n.

Fortunatamente, ci sono implementazioni java.util.List che fanno questo lavoro per voi. Entrambi gli apparecchi java.util.ArrayList e java.util.Vector vengono implementati utilizzando gli array.

Ma poi, ti interessa davvero se le stringhe vengono memorizzate internamente in un array, o hai solo bisogno di una collezione che ti permetta di continuare ad aggiungere oggetti senza preoccuparti di rimanere senza spazio? In quest'ultimo caso, è possibile scegliere tra le varie implementazioni generali List disponibili. Il più delle volte le scelte sono:

  • ArrayList - dati di base implementazione basata array, non sincronizzate
  • Vector - sincronizzati, a base di matrice implementazione
  • LinkedList - implementazione lista doppiamente collegata, più veloce per inserire gli elementi in mezzo di un elenco

Aspetti che il tuo elenco abbia articoli duplicati? Se gli articoli duplicati non dovrebbero mai esistere per il tuo caso d'uso, allora dovresti preferire uno java.util.Set. I set sono garantiti per non contenere oggetti duplicati. Una buona implementazione dell'insieme di scopi generali è java.util.HashSet.

risposta al follow-up questione

Per le stringhe di accesso che utilizzano un indice simile a $my_string_array["property"], è necessario metterli in un Map<String, String>, anche nel pacchetto java.util. Un'implementazione di una buona mappa generale è HashMap.

Una volta creata la mappa,

  • Usa map.put("key", "string") per aggiungere stringhe
  • Utilizzare map.get("key") di accedere a una stringa la sua chiave.

Nota che java.util.Map non può contenere chiavi duplicate. Se si chiama put in modo consecutivo con la stessa chiave, rimarrà solo il valore impostato nell'ultima chiamata, quelli precedenti verranno persi. Ma immagino che questo sia anche il comportamento degli array associativi di PHP, quindi non dovrebbe essere una sorpresa.

Problemi correlati