development

Java 배열은 처음에 요소를 추가하는 방법

big-blog 2020. 6. 14. 09:39
반응형

Java 배열은 처음에 요소를 추가하는 방법


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 provides both the addFirst(E e) and the push(E e) method that add an element to the front of the list.

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


you can use this code

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

You can use list methods, remove and add

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

You can use

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

}

Change E with your datatype

If deleting the oldest element is necessary then you can add:

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

before return statement. Otherwise list will add your object at beginning and also retain oldest element.

This will delete last element in list.


I had a similar problem, trying to add an element at the beginning of an existing array, shift the existing elements to the right and discard the oldest one (array[length-1]). My solution might not be very performant but it works for my purposes.

 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

Good luck


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

참고URL : https://stackoverflow.com/questions/12949690/java-arrays-how-to-add-elements-at-the-beginning

반응형