あなたはList<T>
をラップすることにより、あなたのPool<T>
機能を実装することができます。 remove
は標準List
実装にO(N)
あるため、特に効率的ではないであろう
public class ListPool<T> implements Pool<T> {
private List<T> list = ArrayList<>();
public void put(T t) {
list.append(t);
}
public T randomRemove() {
return list.remove(rand.nextInt(list.size()));
}
}
。しかし、もう少し複雑なArrayList
を使用する代わりの実装がありますが、というrandomRemove
があります。アイデアは、リストを動的配列として扱い、自分自身で "サイズ"を管理することです。このような
何か:
public class FasterPool<T> implements Pool<T> {
private List<T> list = new ArrayList<>();
private int size = 0;
Random rand = new Random();
public void put(T t) {
if (size == list.size()) {
list.append(t);
} else {
list.set(size, t);
size++;
}
public T randomRemove() {
int pos = rand.nextInt(size);
T result = list.get(pos);
if (pos < size - 1) {
list.set(pos, list.get(size - 1));
}
list.set(size - 1, null); // avoid memory leak ...
size--;
return result;
}
}
NB:どちらのバージョンを使用すると、要素を削除しようとすると、プールが空である場合を扱います。どちらもコンパイルもテストもされていません。それに応じてコードを処理してください。
最後に、順序付けられていないコレクション型を使用して実装しようとすると、ランダム要素を効率的に削除することはできません。ヒント:コレクションのイテレータによって返された最初のものを削除することは、実用的なコレクションデータ構造にとって本当にランダムではありません。これは、(仮想の)Bag
の実装にも当てはまります。
guavaライブラリを試してみてください。 – piyush121
そのインタフェースは本当にベアボーンです。 'set'と' get'とは何ですか? 'set'は' 'T'を' 'と' 'get''を入れて' 'T''を取り出して返しますか?もしそうなら、順序付けされたコレクションの大部分は、 'add'と' remove'や 'pop'のバリエーションでちょうど良いものをサポートします。 – user2357112
明示的に順序付けられていないコレクションを探している特別な理由はありますか?ほとんど注文されないことは障害のように思える。 – Dolda2000