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


183

ArrayList큐 에 요소를 추가해야 하지만 요소를 추가하기 위해 함수를 호출 할 때 배열의 시작 부분에 요소를 추가하려고합니다 (따라서 가장 낮은 색인이 있음) 배열에 10 개의 요소가 추가되면 새로운 요소는 가장 오래된 요소 (인덱스가 가장 높은 요소)를 삭제합니다.

누구든지 제안이 있습니까?


당신은 같은 의미합니까 removeadd?
Peter Lawrey

당신이 사용하고있는 귀하의 arraylist stack queue whatever배열의 시작 부분에 추가로 피해야하고 다른 컬렉션을 사용한다 것처럼 사운드를 위해.
Peter Lawrey

먼저, 스스로 무언가를 만들어야합니다. 지금까지 무엇을 했습니까?
Yegoshin Maxim

답변:


301

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);

10
특히 구아바의 컬렉션 클래스가 있기 때문에 10 피트 폴로 아파치 라이브러리를 만지지 않습니다. 구아바의 EvictingQueue가 좋은 선택입니다.
DPM

26

특정 데이터 구조 사용

첫 번째 색인에서 요소를 추가하기 위해 최적화 된 다양한 데이터 구조가 있습니다. 그러나 컬렉션을 이들 중 하나로 변환하면 대화에 시간과 공간의 복잡성이 필요할 것입니다.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)아주 작은 목록에 대한 그래서에만 적합 시간 복잡도를.


목록을 두 번 뒤집습니다. 위의 허용 된 솔루션과 비교하여 알고리즘의 런타임을 큰 차이로 추가합니까?
Samyak Upadhyay

2n을 추가 할 수 있습니다. 그러나 예를 들어 <50의 목록을 가지고 있다면 대부분의 최신 기계의 차이점을 마이크로 벤치마킹 할 수 없습니다
Patrick Favre

8

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

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

추가하면 ArrayList의 크기를 확인하고 끝에있는 크기를 제거 할 수 있습니다.


4

Deque를보고 싶을 수도 있습니다. 목록의 첫 번째 항목과 마지막 항목에 모두 직접 액세스 할 수 있습니다.


1
Deque에 대해 이야기하는 유일한 대답이라는 것이 놀랍습니다. 이것은 분명히 가장 최적의 솔루션입니다.
기 illa F.

3

당신이 묘사하는 것은 사용하기에 적절한 상황 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`

보시다시피 최대 크기에 도달하면 새 요소를 추가하면 삽입 된 첫 번째 요소가 자동으로 제거됩니다.


1

구현이 쉬워야하지만 효율성을 고려할 때 컨테이너로 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);
        }
    }
}


0

이 코드를 사용할 수 있습니다

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);
    }
}

0

리스트 메소드를 사용하고 제거하고 추가 할 수 있습니다.

list.add(lowestIndex, element);
list.remove(highestIndex, element);

0

이 예제를 보자 :-

List<String> element1 = new ArrayList<>();
element1.add("two");
element1.add("three");
List<String> element2 = new ArrayList<>();
element2.add("one");
element2.addAll(element1);

-1

당신이 사용할 수있는

public List<E> addToListStart(List<E> list, E obj){
list.add(0,obj);
return (List<E>)list;

}

데이터 유형으로 E를 변경하십시오.

가장 오래된 요소를 삭제해야하는 경우 다음을 추가 할 수 있습니다.

list.remove(list.size()-1); 

반환 전 진술. 그렇지 않으면 list는 처음에 객체를 추가하고 가장 오래된 요소를 유지합니다.

목록의 마지막 요소가 삭제됩니다.


-1
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);
 }
}

-2

기존 배열의 시작 부분에 요소를 추가하고 기존 요소를 오른쪽으로 이동하고 가장 오래된 요소 (배열 [길이 -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

행운을 빕니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.