5

java.util.Queue同時にアクセスでき、要素がaddedおよび/またはremovedランダムにある実装を探しています。つまり、FIFO 制約に従わない実装を探していますが、現在含まれているエントリ間で新しいエントリを確実にシャッフルします。

コントラクトによるとjava.util.Queue、「キューは通常、FIFO (先入れ先出し) 方式で要素を並べますが、必ずしもそうとは限りません」であることに注意してください。

4

1 に答える 1

2

このように、java.util.concurrent.PriorityBlockingQueue に基づいて独自のバージョンを実装できると思います

class ConcurrenRandomizingQueue<E> extends AbstractQueue<E> {
    static Random r = new Random();
    Queue<Entry> q = new PriorityBlockingQueue<Entry>();

    static class Entry implements Comparable<Entry> {
        Object e;
        int p;

        Entry(Object e) {
            this.e = e;
            this.p = r.nextInt();
        }

        public int compareTo(Entry e) {
            return Integer.compare(p, e.p);
        }
    }

    public boolean offer(E e) {
        return q.offer(new Entry(e));
    }

    public E poll() {
        Entry e = q.poll();
        if (e == null)
            return null;
        return (E) e.e;
    }

    public E peek() {
    Entry e = q.peek();
    if (e == null)
        return null;
    return (E) e.e;
    }

    public int size() {
        return q.size();
    }

    public Iterator<E> iterator() {
        return null; // TODO
    }
}
于 2013-02-16T00:48:47.773 に答える