如何通过哈希表中的索引获取键?
How to get the key by index in Hashtable?
我尝试根据我提供的索引位置获取 Hashtable
中的键值,这是我的哈希表:
Hashtable<Integer, String> hash_table = new Hashtable<Integer, String>();
hash_table.put(5, "This");
hash_table.put(7, "Is");
hash_table.put(10, "Hashtable");
根据索引位置获取key的值,我写了一个方法如下:
public static Integer getKeyByIndex(Hashtable<Integer, String> hashtable, int index) {
Integer keyValue = null;
if(index < 0 || index > hashtable.size() - 1) {
return keyValue;
}
Enumeration<Integer> enu = hashtable.keys();
for(int i = 0; enu.hasMoreElements();) {
keyValue = enu.nextElement();
if(i == index) {
break;
}
++i;
}
return keyValue;
}
以上方法,虽然运行正确,但似乎比较长,没有优化。所以我想知道有没有简单的方法?
我将感谢您提供的解决方案。
地图没有被索引的概念,因为键是无序的。但是您可以使用 LinkedHashMap 保留插入顺序。因此,如果您想说出您插入的 nth
值,那么以下内容对您有用。
LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
map.put(5, "This");
map.put(7, "Is");
map.put(10, "Hashtable");
map.put(100,"foo");
map.put(99,"bar");
int v = getKeyByIndex(map, 2);
System.out.println(v);
打印
10
LinkedHashMap
使用 LinkedKeySet
来维护插入顺序。
- 将键映射到数组。
- 并使用提供的索引索引数组。
- 通过使用泛型类型参数,您可以将此方法用于任何
LinkedHashMap
,而不考虑 key/value 类型。
@SuppressWarnings("unchecked")
public static <K,V> K getKeyByIndex(LinkedHashMap<K, V> map, int index) {
K keyValue = null;
if(index < 0 || index >= map.size()) {
return keyValue;
}
Iterator<K> it = map.keySet().iterator();
for (int i = 0; i < index; i++) {
it.next();
}
return it.next();
}
正如@WJS 指出的那样,正确的方法是使用 LinkedHashMap
维护插入顺序(作为 key/value 对的迭代顺序)。
作为对提出的解决方案的改进,我们可以提取 i-th 密钥,而无需使用 O(1) 内存填充完整的 array/list 映射密钥(这可能效率很低)。
令 map
为 LinkedHashMap
:
LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
map.put(99,"fu");
map.put(33, "bar");
map.put(5, "foo");
流解决方案
static <K,V> K getKeyByIndex(LinkedHashMap<K,V> map, int index)
{
return map.keySet().stream().skip(index).findFirst().orElse(null);
}
使用普通迭代器的解决方案
static <K,V> K getKeyByIndex(LinkedHashMap<K,V> map, int index)
{
final Iterator<K> it = map.keySet().iterator();
for (int i = 0; i < index && it.hasNext(); ++i) {
it.next();
}
return it.hasNext()? it.next() : null;
}
我尝试根据我提供的索引位置获取 Hashtable
中的键值,这是我的哈希表:
Hashtable<Integer, String> hash_table = new Hashtable<Integer, String>();
hash_table.put(5, "This");
hash_table.put(7, "Is");
hash_table.put(10, "Hashtable");
根据索引位置获取key的值,我写了一个方法如下:
public static Integer getKeyByIndex(Hashtable<Integer, String> hashtable, int index) {
Integer keyValue = null;
if(index < 0 || index > hashtable.size() - 1) {
return keyValue;
}
Enumeration<Integer> enu = hashtable.keys();
for(int i = 0; enu.hasMoreElements();) {
keyValue = enu.nextElement();
if(i == index) {
break;
}
++i;
}
return keyValue;
}
以上方法,虽然运行正确,但似乎比较长,没有优化。所以我想知道有没有简单的方法?
我将感谢您提供的解决方案。
地图没有被索引的概念,因为键是无序的。但是您可以使用 LinkedHashMap 保留插入顺序。因此,如果您想说出您插入的 nth
值,那么以下内容对您有用。
LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
map.put(5, "This");
map.put(7, "Is");
map.put(10, "Hashtable");
map.put(100,"foo");
map.put(99,"bar");
int v = getKeyByIndex(map, 2);
System.out.println(v);
打印
10
LinkedHashMap
使用LinkedKeySet
来维护插入顺序。- 将键映射到数组。
- 并使用提供的索引索引数组。
- 通过使用泛型类型参数,您可以将此方法用于任何
LinkedHashMap
,而不考虑 key/value 类型。
@SuppressWarnings("unchecked")
public static <K,V> K getKeyByIndex(LinkedHashMap<K, V> map, int index) {
K keyValue = null;
if(index < 0 || index >= map.size()) {
return keyValue;
}
Iterator<K> it = map.keySet().iterator();
for (int i = 0; i < index; i++) {
it.next();
}
return it.next();
}
正如@WJS 指出的那样,正确的方法是使用 LinkedHashMap
维护插入顺序(作为 key/value 对的迭代顺序)。
作为对提出的解决方案的改进,我们可以提取 i-th 密钥,而无需使用 O(1) 内存填充完整的 array/list 映射密钥(这可能效率很低)。
令 map
为 LinkedHashMap
:
LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
map.put(99,"fu");
map.put(33, "bar");
map.put(5, "foo");
流解决方案
static <K,V> K getKeyByIndex(LinkedHashMap<K,V> map, int index)
{
return map.keySet().stream().skip(index).findFirst().orElse(null);
}
使用普通迭代器的解决方案
static <K,V> K getKeyByIndex(LinkedHashMap<K,V> map, int index)
{
final Iterator<K> it = map.keySet().iterator();
for (int i = 0; i < index && it.hasNext(); ++i) {
it.next();
}
return it.hasNext()? it.next() : null;
}