java hashmap 获取第一个元素_java - 如何从hashmap中获取一个条目而不进行迭代

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值