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)
아주 작은 목록에 대한 그래서에만 적합 시간 복잡도를.
add (int index, E element)를 볼 수 있습니다 .
지정된 요소를이 목록의 지정된 위치에 삽입합니다. 현재 해당 위치에있는 요소 (있는 경우)와 그 이후의 요소를 오른쪽으로 이동합니다 (지수에 하나 추가).
추가하면 ArrayList의 크기를 확인하고 끝에있는 크기를 제거 할 수 있습니다.
당신이 묘사하는 것은 사용하기에 적절한 상황 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)
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);
}
}
기존 배열의 시작 부분에 요소를 추가하고 기존 요소를 오른쪽으로 이동하고 가장 오래된 요소 (배열 [길이 -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
행운을 빕니다
remove
와add
?