2010-09-07 10 views
9

Wenn ich eine Klasse habe, die ein Array von Strings variabler Dimension zurückgeben muss (und diese Dimension konnte nur beim Ausführen einer Methode der Klasse bestimmt werden), wie deklariere ich das dynamische Array im Konstruktor meiner Klasse?Wie initialisiert man ein dynamisches Array in Java?

Wenn die Frage nicht klar genug war,

in php wir einfach ein Array von Strings als $my_string_array = array(); und fügen Sie Elemente, die ihm von $my_string_array[] = "New value";

Was dann den obigen Code entspricht erklären könnte in Java ?

Antwort

13

Sie wollen in die java.util package suchen, speziell die ArrayList Klasse. Es hat Methoden wie .add() .remove() .indexof() .contains() .toArray() und mehr.

+1

Um genau zu sein, es ist in 'java.util' (zusammen mit allen anderen Collection-Klassen). 'java.util.Collections' (mit Großbuchstaben C) ist eine Dienstprogrammklasse, kein Paket. –

+0

@Peter guten Fang, habe ich meine Post –

+0

als Follow-up-Frage, ist es auch möglich, String-Indizes zu erstellen [Beispiel: $ my_string_array ["Eigenschaft"]]? – lock

6

Erstellen Sie stattdessen eine List.

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

Für die meisten Anwendungsfälle ist eine Array-Liste eine bessere Wahl, aber deshalb ist es immer gut, die Variable über Interfaces zu deklarieren, die den Klassen entgegengesetzt sind (daher ist es einfach, die zugrunde liegende Implementierung zu ändern). –

1

Kein dynamisches Array in Java, Länge des Arrays ist festgelegt. Ähnliche Struktur ist ArrayList, ein reales Array wird zugrunde gelegt. Siehe den Namen Array Liste :)

7

Plain Java-Arrays (dh String[] strings) kann nicht dynamisch geändert werden; Wenn Sie keinen Platz mehr haben, aber immer noch Elemente zu Ihrem Array hinzufügen möchten, müssen Sie einen größeren erstellen und das vorhandene Array in seine ersten n Positionen kopieren.

Zum Glück gibt es java.util.List Implementierungen, die diese Arbeit für Sie erledigen. Sowohl java.util.ArrayList als auch java.util.Vector werden mithilfe von Arrays implementiert.

Aber ist es dir wirklich egal, ob die Strings zufällig in einem Array gespeichert sind, oder brauchst du nur eine Sammlung, mit der du Dinge hinzufügen kannst, ohne dir Sorgen zu machen, dass dir kein Platz mehr zur Verfügung steht? Wenn Letzteres, dann können Sie eine der verschiedenen allgemeinen List Implementierungen draußen auswählen. Die meiste Zeit die Möglichkeiten sind:

  • ArrayList - Grund Array-basierte Implementierung, nicht
  • Vector synchronisiert - synchronisiert, Array-basierte Implementierung
  • LinkedList - doppelt verknüpfte Liste Implementierung schneller für Elemente in der Mitte einfügen einer Liste

Erwarten Sie, dass Ihre Liste doppelte Einträge enthält? Wenn doppelte Artikel für Ihren Anwendungsfall nie existieren sollten, sollten Sie eine java.util.Set bevorzugen. Sets enthalten garantiert keine doppelten Objekte. Eine gute Implementierung für allgemeine Zwecke ist java.util.HashSet.

Antwort Frage

Um den Zugriff Strings $my_string_array["property"], ähnlich wie Follow-up müssen Sie sie in einem Map<String, String>, auch im java.util Paket über einen Index setzen. Eine gute allgemeine Kartenimplementierung ist HashMap.

Sobald Sie Ihre Karte erstellt haben,

  • Verwenden map.put("key", "string") in Strings hinzufügen
  • Verwenden map.get("key") einen String durch seinen Schlüssel zuzugreifen.

Beachten Sie, dass java.util.Map keine doppelten Schlüssel enthalten kann. Wenn Sie put nacheinander mit demselben Schlüssel anrufen, bleibt nur der im letzten Gespräch eingestellte Wert erhalten, die früheren gehen verloren. Aber ich denke, das ist auch das Verhalten für assoziative PHP-Arrays, also sollte es keine Überraschung sein.