Java HashTable:在逆序上定义的间隔上克隆哈希表的最优雅方法是什么?

时间:2011-10-16 12:47:02

标签: java hashtable

在开始和结束键之间以相反顺序将键和值从一个哈希表复制到另一个哈希表的最优雅方法是什么?例如,原始哈希表是:

[<1,"object1">; <2, "object2">; <4,"object3">; <5,"object4">;<7,"object5">;<8,"object6">]

在调用函数getPartListOfNews(2,4)之后,它应该像这样返回哈希表:

[<7,"object5">;<5,"object4">;<4,"object3">]

我已经制作了代码来实现它并且它在下面,但我认为这不是一个更好的方式来做我之前描述的。有没有更好的解决方案?如何简化此代码?

public Hashtable<Integer, News> getPartListOfNews(int start, int end){
        Hashtable <Integer, News> tempNewsList = new Hashtable <Integer, News>();
        int total_to_get = end-start;
        int list_size = newsList.size();
        Object[] key_array = new Object[list_size];
        if(list_size < total_to_get){
            return newsList;
        }
        else{
            Enumeration e = newsList.keys();
            int index=0;
            while(e.hasMoreElements()){
                key_array[index] = e.nextElement();
                index  ;
            }
            for (int i=end; i>start; i--){
                tempNewsList.put((Integer)key_array[i], newsList.get(key_array[i]));
            }
            return tempNewsList;
        }
    }

更新

public Hashtable<Integer, News> newsList = new Hashtable<Integer, News>();

感谢。

3 个答案:

答案 0 :(得分:1)

首先,您的代码没有任何效果。哈希表“打破”订单。散列表中元素的顺序取决于特定的散列实现。

JDK中有两种类型的地图:HashMap和SortedMap(通常我们使用它的实现TreeMap)。 BTW不使用Hashtable:这是旧的,同步的,几乎过时的实现)。

当您使用HashMap(和Hashtable)时,键的顺序是不可预测的:它取决于您用作地图键的hashCode()类方法的实现。如果您使用的是TreeMap,则可以使用Comparator来更改此逻辑。

如果您希望按照相同的顺序提取密钥,请使用LinkedHashMap

答案 1 :(得分:1)

我认为没有订购HashTable。如果使用有序数据结构(例如LinkedHashMap),则可以对其进行排序(使用java内置方法)并创建子列表。这应该是2行代码并且非常有效。

答案 2 :(得分:1)

首先,您需要在LinkedHashMap属性中使用newsList,以保留广告订单。此外,如果使用Map接口声明属性并返回方法的值而不是使用的具体类,则更好,这样您就可以轻松地更改实现,如下所示:

private Map<Integer, News> newsList = new LinkedHashMap<Integer, News>();

考虑到上述情况,这是我解决问题的方法:

public Map<Integer, News> getPartListOfNews(int start, int end) {

    // first, get the range of keys from the original map

    List<Integer> keys = new ArrayList<Integer>();
    for (Integer key : newsList.keySet()) // iterates in insertion order
        keys.add(key);
    List<Integer> subkeys = keys.subList(start, end);

    // now add them in the required order

    Map<Integer, News> tempNewsList = new LinkedHashMap<Integer, News>();
    ListIterator<Integer> iter = subkeys.listIterator();
    while (iter.hasPrevious()) {
        Integer key = iter.previous();
        tempNewsList.put(key, newsList.get(key));
    }

    return tempNewsList;

}