[java] Java ArrayList 시작 부분에 요소를 추가하는 방법

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 치트 시트를 참조하십시오 .

리스트 반전

매우 쉽고 비효율적 인 방법은 reverse를 사용하는 것입니다.

 Collections.reverse(list);
 list.add(elementForTop);
 Collections.reverse(list);

Java 8 스트림을 사용하는 경우이 답변이 도움이 될 수 있습니다.

분석

  • 시간 복잡성 : O(n)
  • 공간 복잡성 : O(1)

상기 찾고 JDK 구현 이것을 가지고 O(n)아주 작은 목록에 대한 그래서에만 적합 시간 복잡도를.


답변

add (int index, E element)를 볼 수 있습니다 .

지정된 요소를이 목록의 지정된 위치에 삽입합니다. 현재 해당 위치에있는 요소 (있는 경우)와 그 이후의 요소를 오른쪽으로 이동합니다 (지수에 하나 추가).

추가하면 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)