2011-06-22 6 views
0

ハッシュテーブル1からハッシュテーブル2に最初の5つのキー値ペアをコピーしようとしています 、次にハッシュテーブル1から次の6〜ハッシュ表31つのハッシュテーブルから別のハッシュテーブルにキー値要素をコピーする方法HT

私はこの行くを取得することはできないのですが,,いずれかの任意のヒントを持っている

+1

申し訳ありませんが、実際にどのように問題が発生するかはわかりません。これまでに試してみて、それが代わりに機能しない理由を説明してもらえますか? – dm76

+0

ハッシュテーブルエントリは、一般的に順序付けられていません。 「最初の5つの鍵の値のペア」という意味を説明できますか?どのような順序で最初に? –

+0

@Matt、私はコピーする前に、私はハッシュテーブルにエントリを追加する時間、 – gmhk

答えて

1

はこのような何かを試してみてください私と一緒にそれを共有してくださいすることができます。

Hashtable h = new Hashtable(); 
Hashtable h1 = new Hashtable(); 
Hashtable h2 = new Hashtable(); 
Set s = h.keySet(); 
int i = 0; 
for (Object key : s) { 
    if (i++ < 3) { 
     h1.put(key, h.get(key)); 
    } else { 
     h2.put(key, h.get(key)); 
    } 
} 

ジェネリックなどを適宜追加する。

0

まず、Hashtableは要素が挿入される順序を維持しないので、最初の5つは何でもかまいません。

挿入順序を保持する場合は、LinkedHashMapを使用します(おそらく、スレッドセーフにしたい場合はCollections.synchronizedMap()にラップします)。

はまた、subMap()のような方法を提供していますTreeMapによって実装NavigableMapと呼ばれる素敵なインタフェースは、もありますが、あなたは(代わりにインデックスを使用しての)キーにどのキーから知っている必要があります。そして、これはあなたのエントリーをキーでソートして保持します。

あなたはインデックスのみに頼ることができる場合は、脇LinkedHashMapを使用してから、私は次のような一般的な解決のために行くことをお勧め:

<K, V> Collection<Map<K, V>> splitMap(Map<K, V> map, int count) { 
    if (count <= 0) { 
     throw new IllegalArgumentException("zero or negative count"); 
    } 
    List<Map<K, V>> list = new ArrayList<Map<K, V>>(); 
    Iterator<Entry<K, V>> entries = map.entrySet().iterator(); 
    while (entries.hasNext()) { 
     list.add(subMap(entries, count)); 
    } 
    return list; 
} 

<K, V> Map<K, V> subMap(Iterator<Entry<K, V>> iterator, int count) { 
    Map<K, V> map = new LinkedHashMap<K, V>(); 
    for (int i = 0; i < count && iterator.hasNext(); i++) { 
     Entry<K, V> entry = iterator.next(); 
     map.put(entry.getKey(), entry.getValue()); 
    } 
    return map; 
} 

それからちょうどするためにsplitMap(yourMap、5)を呼び出しそれぞれ5つのエントリを含むマップのコレクション(実際にはリスト)を取得します(最初のマップに十分なエントリがない場合は最後のエントリを少なくします)。

関連する問題