2011-01-07 2 views
3

私はadd(); remove(); clear(); iterator();メソッドのHashSetを使用します。これまでのところすべてが魅力的だった。しかし、今私は別の要件を満たす必要があります。HashSetのランダム開始インデックスイテレータ

特定のインデックスから反復処理を開始したいと考えています。たとえば、次の2つのプログラムが同じ出力を持つようにしたいとします。

プログラム1

Iterator it=map.iterator(); 
for(int i=0;i<100;i++) 
{ 
    it.next(); 
} 
while (it.hasNext()) 
{ 
    doSomethingWith(it.next()); 
} 

プログラム2

Iterator it=map.iterator(100); 
while (it.hasNext()) 
{ 
    doSomethingWith(it.next()); 
} 

私はプログラム1を使用したくない理由は、それが不要なオーバーヘッドを作成することです。私の研究から、私は開始インデックスを持つイテレータを作成する実用的な方法を見つけることができませんでした。

私の質問は、オーバーヘッドを最小限に抑えながら目標を達成するにはどうすればよいでしょうか?

ありがとうございます。

+0

どのような種類のデータ構造を使用しますか? – Xorty

+0

上記の操作をサポートしている限り、データ構造は重要ではありません。しかし、私はそれが単純なArrayListよりも速く(複雑さは少ない)好むでしょう。 –

答えて

5

add()remove()は、HashSetに高速である理由があります。あなたはセット内の要素を速度とメモリコストのランダムアクセスリストとして扱うことができるようになっています。

私はあなたがあなたのセットをリストに最初に変換しない限り、実際にはできないのではないかと心配しています。これは簡単ですが、通常はセット内のすべての要素の完全な処理が必要です。特定の場所からイテレータを開始する能力が同じ状態を2回以上形成したい場合、それは意味をなさないかもしれません。もしそうでなければ、あなたの現在のアプローチではおそらくもっと良いでしょう。

List<Integer> list = new ArrayList<Integer>(set); 
list.subList(100, list.size()).iterator(); // this will get your iterator. 
1

NavigableMapを使用できます。キーに頼ることができ(そして特定のキーから始めることができる)、それはそのままです。

Map<K,V> submap = navigableMap.tailMap(fromKey); 

次に、作成されたサブマップを使用してiterator()を取得し、自分のものを実行します。 それ以外の場合は、インデックスで開始する必要がある場合は、一時的なリストを使用する必要があります。

K fromKey = new ArrayList<K>(navigableMap.keySet()).get(index); 

上記のようにサブマップを取得します。

2

HashSetには注文がありません。だからあなたはリストをインデックスを使うことができるリストに入れることができます。

例:

HashSet set = new HashSet(); 
//...... 
ArrayList list = new ArrayList(set); 
2

HashSetの反復子が順不同でアイテムを生成するので、それは本当にあなたがドロップするかどうかを任意の違いはありません。

コードの

そして今は(Set<Integer> set = new HashSet<Integer>();があなたの宣言したデータ構造であると仮定すると最初からか最後から100項目。

端からのアイテムの削除が速くなります。

Iterator it = map.iterator(); 
int n = map.size() - 100; 
for (int i = 0; i < n; i++) 
    doSomethingWith(it.next()); 
0

Follo wing @ toaderの提案。

for(Integer i : new ArrayList<Integer>(set).subList(100, set.size())) { 
    // from the 100'th value. 
} 

注:n番目の値は、HashSetでは意味を持ちません。おそらくSortedSetが必要な場合があります。この場合、100番目の値は100番目の最大値になります。

関連する問題