2009-03-18 16 views
1

私は隣接リストを使用するGraphというカスタムメイドクラスを持っています。具体的には、各ハッシュマップにすべてのノードの隣接ノードがエッジとして含まれるハッシュマップの配列があります。キーは終了ノードであり、値はEdgeオブジェクトです。配列に格納されたハッシュマップのすべての要素のイテレータ

今、私はこのGraphクラスをIterableにしたいと思っています。すべてのそれらのハッシュマップをマージし、それらのすべての要素に共通のイテレータを返す方法はありますか?

使用する方法が効率的であることは非常に重要です。

あなたは、Apache Commonsのコレクションから ChainedIteratorを使用することができます

答えて

1

APIによると、HashMapには、Hashのマッピングの設定ビューを返すentrySet()という関数があります。集合は反復可能なオブジェクトです。イテレータを作成するには、各ハッシュをセットに変換し、個々のイテレータを1つのイテレータにまとめるだけで簡単に配列を繰り返します。

Javaのイテレータを作成する方法はありませんが、 compose関数は簡単ではありません。

+0

これは私が実際にやったことです。それがいかに効率的であるかを見ることは依然として残る。ご回答有難うございます! –

+0

問題はありませんが、それはあなたのために働くことを願って:D – kgrad

+0

それは十分に速かったようです。私はこれを受け入れたものとしてマークします!再度、感謝します。 –

6

Iterator current = IteratorUtils.emptyIterator(); 
for(map: arrayOfHashmaps) { 
    current = IteratorUtils.chainedIterator(current, map.keySet().iterator); 
} 

あなたはコモンズのコレクションを避けたい場合は、あなただけのリストの中のキーセットを収集し、それを繰り返すことができます。

List allKeys = new LinkedList(); 
for(map: arrayOfHashmaps) { 
    allKeys.addAll(map.KeySet()); 
} 
return allKey.iterator(); 

第二の溶液わずかに多くのメモリを使用し、少し遅くなります。しかし、私はそれが重要であることを疑う。

+0

これはおそらくcurrent = IteratorUtils.chainedIterator(current、map.keySet()。iterator)です。 –

+0

これはおそらく最善の解決策ですが、私はapacheコモンズコレクションをどのように利用するか分かりません。したがって、私はそれをまだ受け入れられたものとしてマークすることはできません。しかし、私は本当にあなたの答えに感謝しています。 –

0

私はそれを行う方法は、Iteratorを実装する内部クラスを作ることです。内部的には、1)マップの配列への現在のインデックス、および2)現在のマップのイテレータを追跡します。そのhasNext()next()メソッドは、単に現在のイテレータに委譲します。イテレータが終了した場合は、単にインデックスをインクリメントしてイテレータを変更します。

0

さまざまなマップで順番に反復する独自のロールを作成するのはなぜですか?

public class MapCollection<K,V> implements Iterable<V> { 
    Map [] maps; 

    public Iterator<V> iterator(){ 
      return new MapCollectionIterator(maps); 
    } 


    private class MapCollectionIterator<T>{ 
     public boolean hasNext() { 
     public T next(){... (code omitted due to lazyness..) 
    } 

}

0

キーは、ノード番号と隣接ノード番号の両方を含むオブジェクトである単一のHashMap、グラフのためのすべてのエントリを格納しようとすることができ、代替として。私は、通常、ノード番号はHashMapsの配列へのインデックスであり、隣のノードは現在のHashMapへのキーであると仮定します。これにより、今行っているのと同じ検索を行うことができ、特別なコードを書かなくてもすべての項目を繰り返し処理できます。

キーとして使用されるオブジェクトのequals()と良いハッシュ関数を書く必要があることを忘れないでください(他の方法では非常に簡単です)。非常に大きなグラフがある場合、これは当然適切ではないかもしれません。

+0

これはいいアイデアです。私が使っているセットを合成する方法が、時間がかかったり、メモリが高価になったりしたら、試してみるといいかもしれません。 –

関連する問題