ArrayList
キューに要素を追加する必要がありますが、関数を呼び出して要素を追加するときに、配列の先頭に要素を追加する必要があります(したがって、インデックスが最も低くなります)。配列に10個の要素が追加されている場合新しい結果として、最も古い要素(インデックスが最も高い要素)が削除されます。
誰か提案はありますか?
List
メソッドadd(int, E)
があるので、次を使用できます。
list.add(0, yourObject);
その後、次のコマンドで最後の要素を削除できます。
if(list.size() > 10)
list.remove(list.size() - 1);
ただし、要件を再考したり、次のような別のデータ構造を使用したりすることもできます。Queue
編集
たぶん、Apacheを見てくださいCircularFifoQueue
:
CircularFifoQueue
は、固定サイズの先入れ先出しキューであり、いっぱいになった場合に最も古い要素を置き換えます。
最大サイズで初期化するだけです。
CircularFifoQueue queue = new CircularFifoQueue(10);
最初のインデックスに要素を追加するために最適化されたさまざまなデータ構造があります。ただし、コレクションをこれらのいずれかに変換する場合、会話にはおそらく時間とスペースの複雑さが必要になります。O(n)
JDKには、次のDeque
ようなメソッドを提供する構造がaddFirst(e)
含まれています。offerFirst(e)
Deque<String> deque = new LinkedList<>();
deque.add("two");
deque.add("one");
deque.addFirst("three");
//prints "three", "two", "one"
挿入の空間と時間の複雑さはLinkedList
定数(O(1)
)です。Big-Oのチートシートを参照してください。
非常に簡単ですが非効率的な方法は、逆を使用することです。
Collections.reverse(list);
list.add(elementForTop);
Collections.reverse(list);
Java 8ストリームを使用している場合、この回答に興味があるかもしれません。
O(n)
O(1)
JDKの実装を見ると、これにはO(n)
時間計算量があるため、非常に小さなリストにのみ適しています。
add(int index、E element)を見ることができます:
このリストの指定された位置に指定された要素を挿入します。現在その位置にある要素(存在する場合)と後続の要素を右にシフトします(インデックスに1つ追加します)。
追加したら、ArrayListのサイズを確認し、最後にあるサイズを削除できます。
Dequeを確認することをお勧めします。リストの最初と最後の両方のアイテムに直接アクセスできます。
あなたが説明しているのは、使用するのに適切な状況Queue
です。
add
新しい要素、そしてremove
古い要素にしたいので。最後に追加し、最初から削除することができます。それは大した違いにはなりません。
キューにはメソッドがadd(e)
ありremove()
、最後に新しい要素を追加し、最初から古い要素をそれぞれ削除します。
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(5);
queue.add(6);
queue.remove(); // Remove 5
したがって、要素をに追加するたびに、メソッド呼び出しqueue
でその要素をバックアップできます。remove
更新:-
そして、のサイズを修正しQueue
たい場合は、以下を見てください:-ApacheCommons#CircularFifoBuffer
からdocumentation
:-
CircularFifoBufferは、固定サイズの先入れ先出しバッファーであり、いっぱいになった場合に最も古い要素を置き換えます。
Buffer queue = new CircularFifoBuffer(2); // Max size
queue.add(5);
queue.add(6);
queue.add(7); // Automatically removes the first element `5`
ご覧のとおり、最大サイズに達すると、新しい要素を追加すると、最初に挿入された要素が自動的に削除されます。
実装は簡単なはずですが、効率を考えると、コンテナとしてArrayListではなくLinkedListを使用する必要があります。次のコードを参照できます。
import java.util.LinkedList;
import java.util.List;
public class DataContainer {
private List<Integer> list;
int length = 10;
public void addDataToArrayList(int data){
list.add(0, data);
if(list.size()>10){
list.remove(length);
}
}
public static void main(String[] args) {
DataContainer comp = new DataContainer();
comp.list = new LinkedList<Integer>();
int cycleCount = 100000000;
for(int i = 0; i < cycleCount; i ++){
comp.addDataToArrayList(i);
}
}
}
Java LinkedListは、リストの先頭に要素を追加するaddFirst(E e)メソッドとpush(E e)メソッドの両方を提供します。
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)
リストメソッドを使用して、削除および追加できます
list.add(lowestIndex, element);
list.remove(highestIndex, element);
このコードを使用できます
private List myList = new ArrayList();
private void addItemToList(Object obj){
if(myList.size()<10){
myList.add(0,obj);
}else{
myList.add(0,obj);
myList.remove(10);
}
}
使用できます
public List<E> addToListStart(List<E> list, E obj){
list.add(0,obj);
return (List<E>)list;
}
Eをデータ型に変更します
最も古い要素を削除する必要がある場合は、次を追加できます。
list.remove(list.size()-1);
returnステートメントの前。それ以外の場合、listは最初にオブジェクトを追加し、最も古い要素も保持します。
これにより、リストの最後の要素が削除されます。
import java.util.*:
public class Logic {
List<String> list = new ArrayList<String>();
public static void main(String...args) {
Scanner input = new Scanner(System.in);
Logic obj = new Logic();
for (int i=0;i<=20;i++) {
String string = input.nextLine();
obj.myLogic(string);
obj.printList();
}
}
public void myLogic(String strObj) {
if (this.list.size()>=10) {
this.list.remove(this.list.size()-1);
} else {
list.add(strObj);
}
}
public void printList() {
System.out.print(this.list);
}
}
import com.google.common.collect.Lists;
import java.util.List;
/**
* @author Ciccotta Andrea on 06/11/2020.
*/
public class CollectionUtils {
/**
* It models the prepend O(1), used against the common append/add O(n)
* @param head first element of the list
* @param body rest of the elements of the list
* @return new list (with different memory-reference) made by [head, ...body]
*/
public static <E> List<Object> prepend(final E head, List<E> final body){
return Lists.asList(head, body.toArray());
}
/**
* it models the typed version of prepend(E head, List<E> body)
* @param type the array into which the elements of this list are to be stored
*/
public static <E> List<E> prepend(final E head, List<E> body, final E[] type){
return Lists.asList(head, body.toArray(type));
}
}
同様の問題が発生しました。既存の配列の先頭に要素を追加し、既存の要素を右にシフトして、最も古い要素(array [length-1])を破棄しようとしました。私のソリューションはあまりパフォーマンスが良くないかもしれませんが、私の目的には役立ちます。
Method:
updateArray (Element to insert)
- for all the elements of the Array
- start from the end and replace with the one on the left;
- Array [0] <- Element
幸運を
この例を見てください:-
List<String> element1 = new ArrayList<>();
element1.add("two");
element1.add("three");
List<String> element2 = new ArrayList<>();
element2.add("one");
element2.addAll(element1);