äquivalent zu push () oder pop () für Arrays?

77

Ich versuche, Elemente zu einem Array hinzuzufügen, zu entfernen und zu referenzieren, das ich in meiner Java-Hauptdatei erstellt habe, aber ich habe Probleme, die richtige Syntax herauszufinden. In Actionscript haben sie push () und pop () zum Hinzufügen und Entfernen von Elementen in einem Array. Gibt es ein Äquivalent in Android?

Clayton33
quelle
1
Was für ein Array hast du? Können Sie uns einen Code zeigen?
EboMike
int [] intArray = new int {2, 3, 5, 8, 13}; Wie würde ich auf intArray [3] oder auf alle Elemente einzeln verweisen?
Clayton33

Antworten:

38

In Java hat ein Array eine feste Größe (nach der Initialisierung), was bedeutet, dass Sie keine Elemente zu einem Array hinzufügen oder daraus entfernen können.

int[] i = new int[10];

Das obige Snippet bedeutet, dass das Array von Ganzzahlen eine Länge von 10 hat. Es ist nicht möglich, eine elfte Ganzzahl hinzuzufügen, ohne den Verweis einem neuen Array wie folgt neu zuzuweisen:

int[] i = new int[11];

In Java enthält das Paket java.util alle Arten von Datenstrukturen, die das Hinzufügen und Entfernen von Elementen aus Array-ähnlichen Sammlungen ermöglichen. Die klassische Datenstruktur Stack verfügt über Methoden für Push und Pop.

Kennet
quelle
9
Gute Erklärung, denken Sie jedoch daran, dass Stack keine so großartige Klasse ist, wie es von Vector erbt, und als solche vollständig synchronisiert ist. Wenn Sie also keine Synchronisierung benötigen, ist ArrayList oder LinkedList wahrscheinlich die bessere Option.
M. Jessup
21

Für diejenigen, die keine Zeit haben, den Code umzugestalten, um Arrays durch Collections zu ersetzen (zum Beispiel ArrayList), gibt es eine Alternative. Im Gegensatz zu Collections kann die Länge eines Arrays nicht geändert werden, das Array kann jedoch wie folgt ersetzt werden:

array = push(array, item);

Die Nachteile sind das

  • Das gesamte Array muss bei jedem Push kopiert werden
  • Das ursprüngliche Array Objectwird nicht geändert, daher müssen Sie die Variablen entsprechend aktualisieren.

Hier ist die pushMethode für String:
(Sie können mehrere pushMethoden erstellen , eine für String, eine für intusw.)

private static String[] push(String[] array, String push) {
    String[] longer = new String[array.length + 1];
    for (int i = 0; i < array.length; i++)
        longer[i] = array[i];
    longer[array.length] = push;
    return longer;
}

Diese Alternative ist effizienter, kürzer und schwerer zu lesen:

private static String[] push(String[] array, String push) {
    String[] longer = new String[array.length + 1];
    System.arraycopy(array, 0, longer, 0, array.length);
    longer[array.length] = push;
    return longer;
}
Bryan Field
quelle
10
Ich rate dringend von der Verwendung dieser Methode ab. Bei wirklich einfachen und kleinen Arrays treten keine Probleme auf. Bei einem mittleren oder schweren Array führt dies jedoch dazu, dass das System jedes Mal, wenn ein Element hinzugefügt wird, über das Array iteriert. Wenn Sie ein Array mit mehr als 100 Elementen haben und weitere 3 Elemente hinzufügen möchten, werden 303 Vorgänge ausgeführt.
Panthro
6

Sie können LinkedList verwenden. Es hat Methoden zu spähen, abzufragen und anzubieten.

zawhtut
quelle
6

Sie können Arrays.copyOf()mit ein wenig Reflexion verwenden, um eine schöne Hilfsfunktion zu erstellen.

public class ArrayHelper {
    public static <T> T[] push(T[] arr, T item) {
        T[] tmp = Arrays.copyOf(arr, arr.length + 1);
        tmp[tmp.length - 1] = item;
        return tmp;
    }

    public static <T> T[] pop(T[] arr) {
        T[] tmp = Arrays.copyOf(arr, arr.length - 1);
        return tmp;
    }
}

Verwendung:

String[] items = new String[]{"a", "b", "c"};

items = ArrayHelper.push(items, "d");
items = ArrayHelper.push(items, "e");

items = ArrayHelper.pop(items);

Ergebnisse

Original: a, b, c

Array nach Push-Aufrufen: a, b, c, d, e

Array nach Pop-Aufruf: a, b, c, d

Chris Stillwell
quelle
Arrays.copyOf()erstellt bei jedem Aufruf ein neues Array. Wenn Sie ein ziemlich langes Array in eine Schleife einfügen müssen, ist die Leistung viel schlechter alsfor (...) {String stringC = stringA + stringB}
Farid