如何将键值元素从一个哈希表复制到另一个哈希表

时间:2011-06-22 10:23:22

标签: java

我正在尝试将哈希表1中的前5个键值对复制到哈希表2中 然后从哈希表1到哈希表3接下来的第6到第10个键值对。

我无法做到这一点,任何人都有任何提示请与我分享

2 个答案:

答案 0 :(得分: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));
    }
}

适当添加泛型等。

答案 1 :(得分:0)

首先,您需要知道Hashtable不能保持插入元素的顺序,因此前5个可以是任何内容。

如果您希望保留插入顺序,请使用LinkedHashMap(如果您希望它是线程安全的,可以将其包装在Collections.synchronizedMap()中。)

此外,还有一个名为NavigableMap的漂亮界面,由TreeMap实现,它提供subMap()之类的方法,但你需要知道从哪个键到哪个键(而不是使用指数)。这也将保持您的条目按键排序。

如果您只依赖索引,除了使用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个条目的地图集合(实际上是一个列表)(如果初始地图中没有足够的条目,则为最后一个或更少)。