227

ArrayListキューに要素を追加する必要がありますが、関数を呼び出して要素を追加するときに、配列の先頭に要素を追加する必要があります(したがって、インデックスが最も低くなります)。配列に10個の要素が追加されている場合新しい結果として、最も古い要素(インデックスが最も高い要素)が削除されます。

誰か提案はありますか?

4

14 に答える 14

372

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);
于 2012-10-18T07:54:28.617 に答える
32

特定のデータ構造の使用

最初のインデックスに要素を追加するために最適化されたさまざまなデータ構造があります。ただし、コレクションをこれらのいずれかに変換する場合、会話にはおそらく時間とスペースの複雑さが必要になります。O(n)

Deque

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)時間計算量があるため、非常に小さなリストにのみ適しています。

于 2015-02-20T14:22:49.827 に答える
10

add(int index、E element)を見ることができます:

このリストの指定された位置に指定された要素を挿入します。現在その位置にある要素(存在する場合)と後続の要素を右にシフトします(インデックスに1つ追加します)。

追加したら、ArrayListのサイズを確認し、最後にあるサイズを削除できます。

于 2012-10-18T07:57:18.180 に答える
6

Dequeを確認することをお勧めします。リストの最初と最後の両方のアイテムに直接アクセスできます。

于 2016-06-30T13:10:47.727 に答える
4

あなたが説明しているのは、使用するのに適切な状況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`

ご覧のとおり、最大サイズに達すると、新しい要素を追加すると、最初に挿入された要素が自動的に削除されます。

于 2012-10-18T08:00:38.783 に答える
3

実装は簡単なはずですが、効率を考えると、コンテナとして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);
        }
    }
}
于 2012-10-18T08:23:14.417 に答える
3

Java LinkedListは、リストの先頭に要素を追加するaddFirst(E e)メソッドとpush(E e)メソッドの両方を提供します。

https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)

于 2017-02-14T06:18:14.977 に答える
2

リストメソッドを使用して、削除および追加できます

list.add(lowestIndex, element);
list.remove(highestIndex, element);
于 2016-03-18T16:01:52.190 に答える
1

このコードを使用できます

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);
    }
}
于 2012-10-18T08:01:00.123 に答える
0

使用できます

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は最初にオブジェクトを追加し、最も古い要素も保持します。

これにより、リストの最後の要素が削除されます。

于 2012-10-18T08:10:25.367 に答える
0
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);
 }
}
于 2018-09-25T05:22:18.570 に答える
0
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));
    }
}
于 2020-11-09T12:20:26.637 に答える
-1

同様の問題が発生しました。既存の配列の先頭に要素を追加し、既存の要素を右にシフトして、最も古い要素(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

幸運を

于 2017-08-09T17:38:01.387 に答える
-1

この例を見てください:-

List<String> element1 = new ArrayList<>();
element1.add("two");
element1.add("three");
List<String> element2 = new ArrayList<>();
element2.add("one");
element2.addAll(element1);
于 2020-06-10T12:05:16.450 に答える