Ich muss einer ArrayList
Warteschlange Elemente hinzufügen , aber wenn ich die Funktion zum Hinzufügen eines Elements aufrufe, möchte ich, dass sie das Element am Anfang des Arrays hinzufügt (damit es den niedrigsten Index hat) und wenn das Array 10 Elemente hinzufügt Ein neues Ergebnis führt zum Löschen des ältesten Elements (des Elements mit dem höchsten Index).
Hat jemand irgendwelche Vorschläge?
remove
undadd
?arraylist stack queue whatever
als Hinzufügen zum Anfang eines Arrays verwenden, wird am besten vermieden, und es klingt so, als ob Sie eine andere Sammlung verwenden sollten.Antworten:
List
hat die Methodeadd(int, E)
, so können Sie verwenden:Anschließend können Sie das letzte Element löschen mit:
Möglicherweise möchten Sie jedoch Ihre Anforderungen überdenken oder eine andere Datenstruktur verwenden, z
Queue
BEARBEITEN
Vielleicht werfen Sie einen Blick auf Apache
CircularFifoQueue
:Initialisieren Sie es einfach mit Ihrer maximalen Größe:
quelle
Verwenden spezifischer Datenstrukturen
Es gibt verschiedene Datenstrukturen, die für das Hinzufügen von Elementen am ersten Index optimiert sind. Beachten Sie jedoch, dass die Konversation wahrscheinlich eine zeitliche und räumliche Komplexität von benötigt, wenn Sie Ihre Sammlung in eine dieser konvertieren
O(n)
Deque
Das JDK enthält die
Deque
Struktur, die Methoden wieaddFirst(e)
und bietetofferFirst(e)
Analyse
Die räumliche und zeitliche Komplexität der Einfügung ist
LinkedList
konstant (O(1)
). Siehe das Big-O-Cheatsheet .Liste umkehren
Eine sehr einfache, aber ineffiziente Methode ist die Verwendung von umgekehrt:
Wenn Sie Java 8-Streams verwenden, könnte Sie diese Antwort interessieren.
Analyse
O(n)
O(1)
Bei der JDK-Implementierung ist diese
O(n)
zeitlich komplex und daher nur für sehr kleine Listen geeignet.quelle
Sie können sich das Add (int index, E element) ansehen :
Sobald Sie hinzugefügt haben, können Sie die Größe der ArrayList überprüfen und die am Ende entfernen.
quelle
Vielleicht möchten Sie sich Deque ansehen. Sie haben direkten Zugriff auf das erste und das letzte Element in der Liste.
quelle
Was Sie beschreiben, ist eine geeignete Situation
Queue
.Da willst du
add
neues Element undremove
das alte. Sie können am Ende hinzufügen und am Anfang entfernen. Das wird keinen großen Unterschied machen.Warteschlange hat Verfahren
add(e)
undremove()
die fügt am Ende das neue Element und entfernt von Anfang an das alte Element, respectively.Jedes Mal, wenn Sie dem ein Element hinzufügen
queue
, können Sie es mit einemremove
Methodenaufruf sichern.UPDATE : -
Und wenn Sie die Größe der festlegen
Queue
möchten , können Sie sich Folgendes ansehen: -ApacheCommons#CircularFifoBuffer
Aus dem
documentation
: -Wie Sie sehen können, entfernt das Hinzufügen eines neuen Elements automatisch das erste eingefügte Element, wenn die maximale Größe erreicht ist.
quelle
Ich denke, das Implement sollte einfach sein, aber angesichts der Effizienz sollten Sie LinkedList verwenden, aber nicht ArrayList als Container. Sie können auf den folgenden Code verweisen:
quelle
Java LinkedList bietet sowohl die Methode addFirst (E e) als auch die Methode push (E e), mit der ein Element am Anfang der Liste hinzugefügt wird.
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)
quelle
Sie können diesen Code verwenden
quelle
Sie können Listenmethoden verwenden, entfernen und hinzufügen
quelle
Sie können verwenden
Ändern Sie E mit Ihrem Datentyp
Wenn das älteste Element gelöscht werden muss, können Sie Folgendes hinzufügen:
vor der Rückgabeerklärung. Andernfalls fügt list Ihr Objekt am Anfang hinzu und behält auch das älteste Element bei.
Dadurch wird das letzte Element in der Liste gelöscht.
quelle
quelle
Nehmen Sie dieses Beispiel: -
quelle
Ich hatte ein ähnliches Problem, als ich versuchte, ein Element am Anfang eines vorhandenen Arrays hinzuzufügen, die vorhandenen Elemente nach rechts zu verschieben und das älteste (Array [Länge-1]) zu verwerfen. Meine Lösung ist möglicherweise nicht sehr leistungsfähig, funktioniert aber für meine Zwecke.
Viel Glück
quelle