java - 如何从hashmap中获取一个条目而不进行迭代
如果密钥未知,是否有一种从HashMap中只获得一个Entry的优雅方式,无需迭代。
由于进入的顺序并不重要,我们可以说类似的东西
hashMapObject.get(zeroth_index);
虽然我知道没有这样的get by index方法。
如果我尝试下面提到的方法,它仍然必须得到hashmap的所有条目集。
for(Map.Entry entry : MapObj.entrySet()) {
return entry;
}
欢迎提出建议。
编辑:请建议任何其他数据结构满足要求。
nilesh asked 2019-05-07T08:15:32Z
14个解决方案
232 votes
地图不是有序的,因此没有“第一个条目”这样的东西,这也是为什么iterator()(或HashMap)上没有按索引获取的方法。
你可以这样做:
Map map = ...; // wherever you get this from
// Get the first entry that the iterator returns
Map.Entry entry = map.entrySet().iterator().next();
(注意:省略了检查空地图)。
您的代码不会获取地图中的所有条目,它会立即返回(并且会突破循环)并找到第一个条目。
要打印第一个元素的键和值:
System.out.println("Key: "+entry.getKey()+", Value: "+entry.getValue());
注意:调用iterator()并不意味着您正在迭代整个地图。
Jesper answered 2019-05-07T08:16:48Z
88 votes
Jesper的答案很好。 另一种解决方案是使用TreeMap(您要求其他数据结构)。
TreeMap myMap = new TreeMap();
String first = myMap.firstEntry().getValue();
String firstOther = myMap.get(myMap.firstKey());
TreeMap有一个开销,所以HashMap更快,但只是作为替代解决方案的一个例子。
Per Östlund answered 2019-05-07T08:15:52Z
27 votes
我想迭代器可能是最简单的解决方案。
return hashMapObject.entrySet().iterator().next();
另一个解决方案(不太漂亮):
return new ArrayList(hashMapObject.entrySet()).get(0);
或者(不是更好):
return hashMapObject.entrySet().toArray()[0];
cadrian answered 2019-05-07T08:17:28Z
13 votes
获取值,将其转换为数组,获取数组的第一个元素:
map.values().toArray()[0]
W.
Wiktor Misiek answered 2019-05-07T08:18:00Z
8 votes
为什么要避免调用entrySet()它通常不会创建一个具有自己上下文的全新对象,而只是提供一个Facade对象。 简单地说entrySet()是一个非常便宜的操作。
Joachim Sauer answered 2019-05-07T08:18:26Z
6 votes
如果你真的想要你建议的API,你可以继承HashMap并跟踪List中的键,例如。 真的没有看到这一点,但它给你你想要的。 如果您解释预期的用例,也许我们可以提出更好的解决方案。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SuppressWarnings("unchecked")
public class IndexedMap extends HashMap {
private List keyIndex;
public IndexedMap() {
keyIndex = new ArrayList();
}
/**
* Returns the key at the specified position in this Map's keyIndex.
*
* @param index
* index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException
* if the index is out of range (index < 0 || index >= size())
*/
public Object get(int index) {
return keyIndex.get(index);
}
@Override
public Object put(Object key, Object value) {
addKeyToIndex(key);
return super.put(key, value);
}
@Override
public void putAll(Map source) {
for (Object key : source.keySet()) {
addKeyToIndex(key);
}
super.putAll(source);
}
private void addKeyToIndex(Object key) {
if (!keyIndex.contains(key)) {
keyIndex.add(key);
}
}
@Override
public Object remove(Object key) {
keyIndex.remove(key);
return super.remove(key);
}
}
编辑:我故意没有深入研究这个泛型方面......
Adriaan Koster answered 2019-05-07T08:19:00Z
6 votes
如果您使用的是Java 8,它就像findFirst()一样简单:
快速举例:
Optional theCarFoundOpt = carMap.values().stream().findFirst();
if(theCarFoundOpt.isPresent()) {
return theCarFoundOpt.get().startEngine();
}
Cacho Santa answered 2019-05-07T08:19:28Z
4 votes
“没有迭代”是什么意思?
你可以使用map.entrySet().iterator().next(),你不会迭代地图(意思是“触摸每个对象”)。 但是,如果不使用迭代器,则无法获得Comparator。 Map.Entry的Javadoc说:
Map.entrySet方法返回一个 地图的集合视图,其中 元素属于这一类。 唯一的 获取地图参考的方法 条目来自于它的迭代器 集合视图。 这些Map.Entry 对象仅对 迭代的持续时间。
你能更详细地解释一下,你想要完成什么? 如果要首先处理对象,匹配特定条件(如“有一个特定的键”),否则回退到其余对象,然后查看PriorityQueue。 它将根据自然顺序或您提供的自定义Comparator订购对象。
janko answered 2019-05-07T08:20:17Z
4 votes
import java.util.*;
public class Friday {
public static void main(String[] args) {
Map map = new HashMap();
map.put("code", 10);
map.put("to", 11);
map.put("joy", 12);
if (! map.isEmpty()) {
Map.Entry entry = map.entrySet().iterator().next();
System.out.println(entry);
}
}
}
这种方法不起作用,因为您使用了HashMap。 我假设在这种情况下使用LinkedHashMap将是正确的解决方案。
dmgcodevil answered 2019-05-07T08:20:43Z
3 votes
这将从地图中获得一个条目,该条目尽可能接近,因为“第一个”并不真正适用。
import java.util.*;
public class Friday {
public static void main(String[] args) {
Map map = new HashMap();
map.put("code", 10);
map.put("to", 11);
map.put("joy", 12);
if (! map.isEmpty()) {
Map.Entry entry = map.entrySet().iterator().next();
System.out.println(entry);
}
}
}
Michael Easter answered 2019-05-07T08:21:10Z
2 votes
偶然发现在寻找同样的事情......然后我想起了Guava图书馆的Iterables.getFirst课程。
要获得“第一”元素:Iterables.getFirst。
基本上与Iterables.getLast相同,但如果Map中没有任何内容,也允许您指定默认值(在本例中为null)。
Iterables.getFirst返回Map中的最后一个元素。
Iterables.getFirst返回Map中的第7个元素(如果存在),否则返回默认值(在本例中为null)。
请记住,虽然没有订购HashMaps ...所以不要指望Iterables.getFirst返回你在那里扔的第一个项目......同样用Iterables.getLast.虽然可能对获取映射值很有用。
可能不值得为此添加Guava库,但如果您碰巧使用该库中的其他一些很酷的实用程序......
SquidRott answered 2019-05-07T08:22:20Z
1 votes
在你的编辑后,这是我的建议:
如果只有一个条目,则可以用双重对象替换Map。根据类型和您的偏好:
一个数组(2个值,键和值)
一个具有两个属性的简单对象
KLE answered 2019-05-07T08:23:08Z
0 votes
mapm;
auto it=m.begin();//get iterator to the first element of map(m)
return m->first;//return first string(1st string in mapm)
//Incase you want the second string
//you can use return m->second(2st string in mapm)
//if you want to iterate the whole map you can use loop
for(auto it:m)//m is a map
cout<first<
Vipul Vikram answered 2019-05-07T08:23:28Z
-2 votes
我得到了答案:(很简单)
取一个ArrayList然后转换它并找到arraylist的大小。这里是 :
ArrayList count = new ArrayList();
count=(ArrayList) maptabcolname.get("k1"); //here "k1" is Key
System.out.println("number of elements="+count.size());
它会显示大小。 (给出建议)。 它正在发挥作用。
Indranil Banerjee answered 2019-05-07T08:24:09Z