2017-09-21 3 views
1

과 같은 큐가 Apache Commons에 있어야하지만 요소를 역순으로 반복 할 수 있어야합니다. 즉, 고정 요소 대기열에 요소를 삽입하고 이전 요소를 자동 제거해야합니다. 하지만 가장 어린 요소부터 시작하여 요소를 반복해야합니다. 자바에서 사용할 수있는 것이 있습니까?Java에서 이전 요소를 제거하는 고정 크기 Deque가 있습니까?

+0

당신은 (https://docs.oracle.com/javase/7/docs/api/java/util/Deque.html) 자바 Deque와 인터페이스를 구현하는 클래스를 통해 봤어? 이 클래스들은 descendingIterator() 메서드를 제공하여 역순으로 반복 할 수 있기 때문에 유용 할 수 있습니다. –

+1

그러나 모든 Deque에는 descendingIterator()가 있어야합니다. 아직도 Deque는 오래된 요소를 자동으로 제거하지 못했습니다. – Alexandr

답변

1

다음과 같이 사용할 수 있습니다. push, pushLast ...와 같은 다른 삽입 방법을 다시 작성해야하지만 다른 사용 가능한 솔루션 (있는 경우)을 듣고 싶습니다.

public class ConcurrentFixedSizeLinkedDeque<T> extends ConcurrentLinkedDeque<T> { 

    private int sizeLimit = Integer.MAX_VALUE; 

    public ConcurrentFixedSizeLinkedDeque() { 
    } 

    public ConcurrentFixedSizeLinkedDeque(Collection<? extends T> c) { 
     super(c); 
    } 

    public ConcurrentFixedSizeLinkedDeque(int sizeLimit) { 
     if(sizeLimit<0) sizeLimit=0; 
     this.sizeLimit = sizeLimit; 
    } 

    public ConcurrentFixedSizeLinkedDeque(Collection<? extends T> c, int sizeLimit) { 
     super(c); 
     if(sizeLimit<0) sizeLimit=0; 
     this.sizeLimit = sizeLimit; 
    } 

    public int getSizeLimit() { 
     return sizeLimit; 
    } 

    public void setSizeLimit(int sizeLimit) { 
     this.sizeLimit = sizeLimit; 
    } 

    @Override 
    public void addFirst(T e){ 
     while(size()>=this.sizeLimit){ 
      pollLast(); 
     } 
     super.addFirst(e); 
    } 

    @Override 
    public void addLast(T e){ 
     while(size()>=this.sizeLimit){ 
      pollFirst(); 
     } 
     super.addLast(e); 
    } 
} 
관련 문제