2012-10-31 66 views
4

我正在尋找一個Deque,其具有以下特徵:尋找一個圓形的固定尺寸的基於陣列的雙端隊列

  • 它固定大小
  • 如果我在頭/尾元件的添加元素相對端降
  • 它是基於陣列的,所以我可以在恆定的時間訪問隨機元素
  • 我可以在前面或在末端(雙端隊列)
0123添加元素

我檢查了JCF中的Deque實現,但我沒有找到任何適合的東西。

+0

http://docs.oracle.com/javase/7/docs/api/java/util/Deque.html它的存在,但它聽起來就像你必須讓自己的子類使其工作在固定大小 – CBredlow

+0

我知道Deque在JCF中存在我在我的問題中提到它。 –

+0

最接近的是ArrayDeque。爲什麼你想丟棄元素?爲什麼你想隨機訪問一個隊列,尤其是隨機元素可能不再存在? –

回答

3

,因爲我喜歡寫我自己的數據類型,

import static org.junit.Assert.assertEquals; 
import org.junit.Test; 

public class Ring { 

    private String[] data; 
    int n = 0; 

    public Ring(int size) { 
     data = new String[size]; 
    } 

    public void push(String s) { 
     data[n] = s; 
     n = (n + 1) % data.length; 
    } 

    public void shift(String s) { 
     data[n = (n - 1) % data.length] = s; 
    } 

    public String get(int index) { 
     return data[(n + index) % data.length]; 
    } 

    public static class Examples { 

     @Test 
     public void shouldDropElementsWhenPushingTooFar() { 
      Ring ring = new Ring(3); 
      ring.push("A"); 
      ring.push("B"); 
      ring.push("C"); 
      ring.push("D"); 
      ring.push("E"); 
      assertEquals("C", ring.get(0)); 
      assertEquals("D", ring.get(1)); 
      assertEquals("E", ring.get(2)); 
     } 

     @Test 
     public void shouldAddElementsAtTheFront() { 
      Ring ring = new Ring(3); 
      ring.push("A"); 
      ring.push("B"); 
      ring.push("C"); 
      ring.push("D"); 
      ring.push("E"); 
      // rewind 
      ring.shift("B"); 
      assertEquals("B", ring.get(0)); 
      assertEquals("C", ring.get(1)); 
      assertEquals("D", ring.get(2)); 
     } 

    } 

} 
+0

這裏有一個錯誤:移位會導致一個'ArrayIndexOutOfBoundsException'。解決方法是將'(n-1)%data.length'更改爲'(n-1 + data.length)%data.length'。原因是Java的模運算符[可能導致負值](https://stackoverflow.com/q/4412179)。 –