HashMap - 获取第一个键值

Posted

技术标签:

【中文标题】HashMap - 获取第一个键值【英文标题】:HashMap - getting First Key value 【发布时间】:2014-12-01 12:55:55 【问题描述】:

以下是HashMap中包含的值

statusName Active=33, Renewals Completed=3, Application=15

获取第一个 Key(即 Active)的 Java 代码

Object myKey = statusName.keySet().toArray()[0];

我们如何收集第一个键“值”(即 33),我想将“键”和“值”存储在单独的变量中。

【问题讨论】:

您确实意识到HashMap 条目是无序的,因此每当您修改地图时“first”可能会改变? 您知道HashMap 中没有特定的顺序吗?如果你完全修改它,你可能会以完全不同的顺序得到结果。 不,顺序不保证从运行到运行,但在同一个线程内,顺序是可以依赖的。 @JonSkeet 实际上这是一个非常有效的问题。在 Groovy 中有很多情况下,您会得到一个看起来像一个映射列表的结构,每个映射都有一个条目。到目前为止,我还没有找到一种简单/明显(Groovy)的方式来打印所有值。如果键是常量,则像 collection.eachprintln it.key 一样简单地打印出每个值,但是没有常量键并不明显,但是 collection.eachprintln it.values()[0] 可以工作(这里的一些答案的改进......)。 @BillK:如果您知道每张地图都只有一个条目,那么这确实是一个不同的问题,而且更有意义。 【参考方案1】:

你可以试试这个:

 Map<String,String> map = new HashMap<>();
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key = entry.getKey();
 String value = entry.getValue();

请注意,HashMap 不保证广告顺序。使用LinkedHashMap 保持订单不变。

例如:

 Map<String,String> map = new LinkedHashMap<>();
 map.put("Active","33");
 map.put("Renewals Completed","3");
 map.put("Application","15");
 Map.Entry<String,String> entry = map.entrySet().iterator().next();
 String key= entry.getKey();
 String value=entry.getValue();
 System.out.println(key);
 System.out.println(value);

输出:

 Active
 33

更新: 在Java 8 或更高版本中获取第一个密钥。

Optional<String> firstKey = map.keySet().stream().findFirst();
if (firstKey.isPresent()) 
    String key = firstKey.get();

【讨论】:

我知道这是一个非常古老的答案。这适用于键和值作为字符串的哈希图。但是当对对象尝试相同的值时,会出现转换错误:com.google.gson.internal.LinkedTreeMap cannot be cast to... ...我在正确位置声明的课程而不是String...无法在线找到答案..帮助 @darthydarth 你应该根据你的上下文使用正确的类型。 首先非常感谢您的回答!没想到...第二次我发现泛型没有在运行时保存有问题。最终我通过使用Gson 将值对象转换为String 然后将其解析回我的类类型来绕过它。它很难看,但我真的找不到任何其他解决方案来解决用其他语言很容易做到的事情(我现在正在学习 Java) 确定但是怎么做?对于 cmets 部分来说太多了 @darthydarth 你可以给我发邮件。 ruchiragayan@gmail.com【参考方案2】:

要获得“第一个”值:

map.values().toArray()[0]

获取“第一个”键的值:

map.get(map.keySet().toArray()[0])

注意:上面的代码已经过测试并且可以工作。

我说“第一”是因为 HashMap 条目没有排序。

但是,LinkedHashMap 会按照插入的顺序迭代其条目 - 如果插入顺序很重要,您可以将其用于地图实现。

【讨论】:

您首先需要检查地图是否为空【参考方案3】:

Java 8 的做法,

String firstKey = map.keySet().stream().findFirst().get();

【讨论】:

如果我们有密钥,使用 map.get(firstKey) 检索第一个值。只是一个提示。 :) 不要使用这种方法!如果 map 变量来自 HashMap 类型,这将无法可靠地工作,请转换为 Array 或 LinkedHashMap!【参考方案4】:

您也可以尝试以下方法以获得整个第一个条目,

Map.Entry<String, String> entry = map.entrySet().stream().findFirst().get();
String key = entry.getKey();
String value = entry.getValue();

下面展示了如何获取第一个条目的密钥,

String key = map.entrySet().stream().map(Map.Entry::getKey).findFirst().get();
// or better
String key = map.keySet().stream().findFirst().get();

下面展示了如何获取第一个条目的值,

String value = map.entrySet().stream().map(Map.Entry::getValue).findFirst().get();
// or better
String value = map.values().stream().findFirst().get();

此外,如果希望获得地图的第二个(第三个等)项目,并且您已验证此地图包含至少 2 个条目,您可以使用以下内容。

Map.Entry<String, String> entry = map.entrySet().stream().skip(1).findFirst().get();
String key = map.keySet().stream().skip(1).findFirst().get();
String value = map.values().stream().skip(1).findFirst().get();

【讨论】:

【参考方案5】:

我们如何收集第一个键“值”(即 33)

通过youMap.get(keyYouHave),可以得到它的值。

想要将“Key”和“Value”都存储在单独的变量中

是的,您可以将其分配给变量。

等等……还没有结束。

如果您(业务逻辑)依赖于插入和检索的顺序,您将看到奇怪的结果。地图未订购,他们不会按订单存储。请注意这一事实。使用一些替代方法来保留您的订单。可能是LinkedHashMap

【讨论】:

【参考方案6】:

请注意,您应该注意,您的逻辑流绝不能依赖于以某种顺序访问 HashMap 元素,简单地说,因为 HashMaps 没有排序 Collections,这不是他们的目标. (您可以在this post 中阅读有关 odered 和 sorter 集合的更多信息)。

回到帖子,你已经通过加载第一个元素键完成了一半的工作:

Object myKey = statusName.keySet().toArray()[0];

只需调用map.get(key) 即可获取相应的值:

Object myValue = statusName.get(myKey);

【讨论】:

【参考方案7】:

请记住,一般来说,地图中不遵守插入顺序。试试这个:

    /**
     * Get the first element of a map. A map doesn't guarantee the insertion order
     * @param map
     * @param <E>
     * @param <K>
     * @return
     */
    public static <E,K> K getFirstKeyValue(Map<E,K> map)
        K value = null;
        if(map != null && map.size() > 0)
            Map.Entry<E,K> entry =  map.entrySet().iterator().next();
            if(entry != null)
                value = entry.getValue();
        
        return  value;
    

我仅在确定 map.size() == 1 时才使用它。

【讨论】:

【参考方案8】:

改进 whoami 的回答。由于findFirst() 返回一个Optional,它是 检查是否有值的好习惯。

 var optional = pair.keySet().stream().findFirst();

 if (!optional.isPresent()) 
    return;
 

 var key = optional.get();

另外,有些人评论说找到HashSet 的第一个键是不可靠的。但有时我们有HashMap 对;即在每张地图中,我们都有一个键和一个值。在这种情况下,快速找到这样一对中的第一个密钥是很方便的。

【讨论】:

【参考方案9】:

Kotlin 答案

获取第一个键,然后获取键的值。 Kotlin 具有“first()”功能:

val list = HashMap<String, String>() // Dummy HashMap.

val keyFirstElement = list.keys.first() // Get key.

val valueOfElement = list.getValue(keyFirstElement) // Get Value.

【讨论】:

【参考方案10】:

这也是一个不错的方法:)

Map<Integer,JsonObject> requestOutput = getRequestOutput(client,post);
int statusCode = requestOutput.keySet().stream().findFirst().orElseThrow(() -> new RuntimeException("Empty"));

【讨论】:

【参考方案11】:

你也可以试试下面的:

Map.Entry<String, Integer> entry = myMap.firstEntry();
System.out.println("First Value = " + entry);

【讨论】:

没有这种方法

以上是关于HashMap - 获取第一个键值的主要内容,如果未能解决你的问题,请参考以下文章

深度解剖HashMap底层原理

将HashMap的特定键值集复制到另一个

23.说一下 HashMap 的实现原理?

HashMap的基本使用

HashMap知识梳理

HashMap底层实现原理