在开始键和结束键之间以相反的顺序将键和值从一个散列表复制到另一个散列表,最优雅的方法是什么?例如,原始哈希表为:
[<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>();
谢谢。
首先,您需要在newsList
属性中使用LinkedHashMap
,以保持插入顺序。此外,如果使用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;
}
首先,您的代码没有任何效果。哈希表"打破"了顺序。哈希表中元素的顺序取决于特定的哈希实现。
JDK中有两种类型的map: HashMap和SortedMap(通常我们使用它的实现TreeMap)。顺便说一句,不要使用哈希表:这是旧的,同步的,几乎过时的实现)。
当你使用HashMap(和Hashtable)键的顺序是不可预测的:它取决于hashCode()
方法的实现你正在使用的键的映射。如果您正在使用TreeMap,则可以使用Comparator更改此逻辑。
如果您希望您的密钥以相同的顺序提取,请使用LinkedHashMap
。
我认为HashTable没有排序。如果使用有序的数据结构(如LinkedHashMap),则可以对其进行排序(使用java内置方法)并创建子列表。这应该是2行代码,非常有效。