4

私はDeque次の特徴を持っているを探しています:

  • サイズは固定されています
  • ヘッド/テールに要素を追加すると、反対側の要素がドロップアウトします
  • 配列ベースなので、一定時間でランダムな要素にアクセスできます
  • 前または最後に要素を追加できます(deque)

JCFDequeの実装を確認しましたが、適切なものは見つかりませんでした。

4

1 に答える 1

2

自分のデータ型を書くのが好きなので、

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

    }

}
于 2012-11-25T22:17:28.077 に答える