Ich habe eine Klasse - xClass, die ich in ein Array von xClass laden möchte, damit ich die Deklaration:
xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();
Ich weiß jedoch nicht, ob ich 10 benötige. Möglicherweise benötige ich 8 oder 12 oder eine andere Nummer. Ich werde es erst zur Laufzeit wissen. Kann ich die Anzahl der Elemente in einem Array im laufenden Betrieb ändern? Wenn das so ist, wie?
Antworten:
Nein, Sie können die Größe eines einmal erstellten Arrays nicht ändern. Entweder müssen Sie es größer zuweisen, als Sie denken, oder Sie müssen den Aufwand für die Neuzuweisung akzeptieren, um an Größe zu gewinnen. Wenn dies der Fall ist, müssen Sie eine neue zuweisen und die Daten von der alten in die neue kopieren:
Wenn Sie sich in dieser Situation befinden, würde ich die Verwendung der Java-Sammlungen dringend empfehlen. Insbesondere
ArrayList
umschließt ein Array im Wesentlichen und kümmert sich um die Logik zum Erweitern des Arrays nach Bedarf:Im Allgemeinen
ArrayList
ist aus mehreren Gründen ohnehin eine bevorzugte Lösung für ein Array. Zum einen sind Arrays veränderlich. Wenn Sie eine Klasse haben, die dies tut:Sie haben ein Problem erstellt, da ein Anrufer Ihr privates Datenelement ändern kann, was zu allen Arten von defensivem Kopieren führt. Vergleichen Sie dies mit der Listenversion:
quelle
In Java ist die Array-Länge festgelegt.
Sie können eine Liste verwenden, um die Werte zu speichern und die
toArray
Methode bei Bedarf aufzurufen. Siehe folgendes Beispiel:quelle
Wie bereits erwähnt, können Sie die Größe eines vorhandenen Java-Arrays nicht ändern.
ArrayList ist diejenige, die Standard-Java einem Array mit dynamischer Größe am nächsten kommt. Es gibt jedoch einige Dinge an ArrayList (eigentlich die List-Schnittstelle), die nicht "Array-ähnlich" sind. Beispielsweise:
[ ... ]
Liste indizieren. Sie müssen die Methodenget(int)
undset(int, E)
verwenden.set(15, foo)
.add
,insert
undremove
Methoden.Wenn Sie etwas Array-ähnlicheres möchten, müssen Sie Ihre eigene API entwerfen. (Vielleicht könnte sich jemand in eine vorhandene Bibliothek eines Drittanbieters einmischen ... Ich konnte keine mit 2 Minuten "Recherche" mit Google finden :-))
Wenn Sie wirklich nur ein Array benötigen, das beim Initialisieren wächst , ist die Lösung ungefähr so.
quelle
Sie legen die Anzahl der Elemente zum Zeitpunkt der Erstellung auf einen beliebigen Wert fest:
Anschließend können Sie die Elemente in einer Schleife initialisieren. Ich vermute, dass Sie das brauchen.
Wenn Sie dem Array nach dem Erstellen Elemente hinzufügen oder entfernen müssen, müssen Sie ein verwenden
ArrayList
.quelle
Sie können ArrayList verwenden:
...
quelle
Arrays.copyOf()
Die Methode bietet viele Optionen, um das Problem zu beheben, wenn die Array-Länge dynamisch zunimmt.Java API
quelle
Ja, wickeln Sie es ein und verwenden Sie das Collections-Framework.
Verwenden Sie dann bei Bedarf List.toArray () oder iterieren Sie einfach über diese Liste.
quelle
Wie andere Benutzer sagen, benötigen Sie wahrscheinlich eine Implementierung von java.util.List.
Wenn Sie aus irgendeinem Grund endlich ein Array benötigen, können Sie zwei Dinge tun:
Verwenden Sie eine Liste und konvertieren Sie sie dann mit myList.toArray () in ein Array.
Verwenden Sie ein Array bestimmter Größe. Wenn Sie mehr oder weniger Größe benötigen, können Sie diese mit den Methoden java.util.Arrays ändern.
Die beste Lösung hängt von Ihrem Problem ab;)
quelle
Ich empfehle stattdessen Vektoren zu verwenden. Sehr einfach zu bedienen und verfügt über viele vordefinierte Methoden zur Implementierung.
Um ein Element hinzuzufügen, verwenden Sie einfach:
In (5,2) ist die erste 5 die Anfangsgröße des Vektors. Wenn Sie die ursprüngliche Größe überschreiten, wächst der Vektor um 2 Stellen. Wenn es wieder überschreitet, erhöht es sich erneut um 2 Stellen und so weiter.
quelle
Wo Sie das Array myclass [] deklarieren als:
Geben Sie einfach als Argument die Anzahl der benötigten XClass-Elemente ein. Wissen Sie zu diesem Zeitpunkt, wie viele Sie benötigen werden? Wenn Sie das Array mit 10 Elementen deklarieren, deklarieren Sie nicht 10 XClass-Objekte, sondern erstellen einfach ein Array mit 10 Elementen vom Typ xClass.
quelle
Java-Array-Größen sind fest. Sie können keine dynamischen Arrays wie in C ++ erstellen.
quelle
Es wird empfohlen, zuerst die Menge zu ermitteln, die Sie speichern müssen, und dann das Array zu initialisieren.
Beispielsweise würden Sie den Benutzer fragen, wie viele Daten er speichern und dann initialisieren muss, oder die Komponente oder das Argument abfragen, wie viele Sie speichern müssen. Wenn Sie ein dynamisches Array möchten, das Sie verwenden
ArrayList()
und mit deral.add();
Funktion weiter hinzufügen können, können Sie es auf ein festes Array übertragen.Dabei ist überflüssig , aber nur Sie auf die Idee zu zeigen,
ArrayList
kann Objekte im Gegensatz zu anderen primitiven Datentypen hält und ist sehr leicht zu manipulieren, etwas von der Mitte entfernt einfach wie gut ist, vollständig dynamic.same mitList
undStack
quelle
Ich weiß nicht, ob Sie die Größe zur Laufzeit ändern können, aber Sie können die Größe zur Laufzeit zuweisen. Versuchen Sie es mit diesem Code:
Dadurch wird Ihre Arraygröße der zur Laufzeit in x eingegebenen Größe zugewiesen.
quelle
Hier ist eine Methode, die ArrayList nicht verwendet. Der Benutzer gibt die Größe an und Sie können eine Do-While-Schleife für die Rekursion hinzufügen.
quelle
In Java haben Array-Größen immer eine feste Länge. Es gibt jedoch eine Möglichkeit, die Größe des Arrays zur Laufzeit selbst dynamisch zu erhöhen
Dies ist der am häufigsten verwendete und bevorzugte Weg, dies zu tun.
Im obigen Code initialisieren wir ein neues temp [] -Array und verwenden ferner eine for-Schleife, um den Inhalt des temp mit dem Inhalt des ursprünglichen Arrays zu initialisieren, d. H. stck []. Und dann kopieren Sie es wieder auf das Original zurück und erhalten eine neue Reihe neuer GRÖSSEN.
Zweifellos wird ein CPU-Overhead generiert, da ein Array mit der for-Schleife wiederholt neu initialisiert wird. Sie können es jedoch weiterhin in Ihrem Code verwenden und implementieren. Verwenden Sie für die beste Vorgehensweise "Verknüpfte Liste" anstelle von Array, wenn die Daten dynamisch im Speicher mit variabler Länge gespeichert werden sollen.
Hier ist ein Echtzeitbeispiel basierend auf dynamischen Stapeln, um die ARRAY-GRÖSSE zur Laufzeit zu erhöhen
Dateiname: DStack.java
Dateiname: Exec.java
(mit der Hauptklasse)
Hoffe das löst deine Frage.
quelle
Ja, wir können das so machen.
quelle
Da ArrayList zu viel Speicher benötigt, wenn ich ein Array primitiver Typen benötige, bevorzuge ich die Verwendung von IntStream.builder () zum Erstellen von int-Arrays (Sie können auch LongStream- und DoubleStream-Builder verwenden).
Beispiel:
Hinweis: Verfügbar seit Java 8.
quelle
Sie können etwas tun
quelle