ArrayList
なんでもキューに要素を追加する必要がありますが、要素を追加する関数を呼び出すと、配列の先頭に要素を追加して(インデックスが最小になるように)、配列に10要素がある場合は追加します新しい結果として、最も古い要素(インデックスが最も高い要素)が削除されます。
誰か提案はありますか?
arraylist stack queue whatever
配列の先頭に追加するために何を使用しているのかを避けるのが最善であり、別のコレクションを使用する必要があるようです。
ArrayList
なんでもキューに要素を追加する必要がありますが、要素を追加する関数を呼び出すと、配列の先頭に要素を追加して(インデックスが最小になるように)、配列に10要素がある場合は追加します新しい結果として、最も古い要素(インデックスが最も高い要素)が削除されます。
誰か提案はありますか?
arraylist stack queue whatever
配列の先頭に追加するために何を使用しているのかを避けるのが最善であり、別のコレクションを使用する必要があるようです。
回答:
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チートシートをご覧ください。
非常に簡単だが非効率的な方法は、reverseを使用することです。
Collections.reverse(list);
list.add(elementForTop);
Collections.reverse(list);
Java 8ストリームを使用している場合、この回答は興味深いかもしれません。
O(n)
O(1)
JDK実装を見ると、これはO(n)
時間的に複雑であるため、非常に小さなリストにのみ適しています。
あなたはを見てとることができ、追加(int型のインデックス、Eの要素):
リストの指定された位置に指定された要素を挿入します。現在その位置にある要素(存在する場合)と後続の要素を右に移動します(インデックスに1を加えます)。
追加したら、ArrayListのサイズを確認し、最後のサイズを削除できます。
あなたが説明しているのは、使用するのに適切な状況Queue
です。
add
新しい要素とremove
古いものにしたいので。最後に追加し、最初から削除できます。それは大きな違いはありません。
Queueにはメソッドが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)
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);
}
}
remove
とadd
?