HashMap-获取第一密钥值


128

以下是HashMap中包含的值

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

Java代码获取第一个密钥(即活动)

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

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


9
您确实意识到HashMap条目是无序的,因此只要修改地图,“ first”可能会更改?
NPE

1
您了解HashMap吗?中没有特定顺序?如果完全修改它,则可能会以完全不同的顺序获得结果。
乔恩·斯基特

不,不能保证每次运行都可以执行顺序,但是可以在同一线程中使用顺序。
2014年

1
@JonSkeet实际上,这是一个非常有效的问题。在Groovy中,很多情况下您会得到一个看起来像地图列表的结构,每个地图都有一个条目。到目前为止,我还没有找到一种简单/显而易见的方法(Groovy)来打印所有值。如果键是常数,则可以像collection.each {println it.key}一样容易地打印出每个值,但是没有常数键就不那么明显了,但是collection.each {println it.values()[0]}可以正常工作(这里的一些答案的完善...)。
比尔K

@BillK:如果您知道每张地图都只有一个条目,那么这确实是一个不同的问题,而且更有意义。
乔恩·斯基特

Answers:


249

您可以尝试以下方法:

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

请记住,HashMap不保证插入顺序。使用a 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

我知道这是一个非常老的答案..这适用于键和值作为字符串的哈希映射。但是当尝试与对象进行相同操作以获取值而导致转换错误时:com.google.gson.internal.LinkedTreeMap cannot be cast to......我声明的课而不是String在正确的位置...我无法在线找到答案..help
Blue Bot

@darthydarth您应该根据上下文使用适当的类型。
Ruchira Gayan Ranaweera '17

首先超级感谢您的回答!没想到...第二,我发现,泛型存在未在运行时保存的问题。最终,我通过使用Gson将值对象转换为a String然后将其解析回我的类类型来解决它。它很丑陋,但我真的找不到其他解决方案的任何其他解决方案,而这种解决方案很容易用其他语言完成(我现在学习Java)
Blue Bot

当然可以,但是如何?对于评论版块来说太多了
Blue Bot

@darthydarth,您可以给我发送电子邮件。ruchiragayan@gmail.com
Ruchira Gayan Ranaweera '17

65

要获得“第一”值:

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

要获取“第一个”键的值:

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

注意:以上代码已通过测试并可以正常工作。

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

但是,LinkedHashMap以与插入时相同的顺序迭代其条目-如果插入顺序很重要,则可以将其用于地图实现。


您首先需要检查地图是否为空
-ACV

48

Java 8的工作方式,

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


如果有键,请使用map.get(firstKey)检索第一个值。只是一个提示。:)
Upen

7

您也可以尝试使用此方法来获取整个第一个条目,

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();

此外,如果您知道自己在做什么,并且希望获得地图的第二项(与第三项相同),则应尝试这样做,

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();

4

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

通过使用youMap.get(keyYouHave),您可以获取其价值。

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

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

等待.........还没有结束。

如果您(业务逻辑)取决于插入和检索的顺序,则会看到奇怪的结果。未订购地图,因此不会将其存储在订单中。请注意这一事实。使用其他方法来保留您的订单。大概一个LinkedHashMap


2

请注意,您应该注意,您的逻辑流程绝不能依赖于HashMap以某种顺序访问元素,只是因为HashMaps不是有序的Collections,而这并不是它们的目的。(您可以在本文中阅读有关odered和sorter集合的更多信息)。

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

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

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

Object myValue = statusName.get(myKey);

1

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

    /**
     * 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


1

改善whoami的答案。由于findFirst()返回Optional,因此最好检查是否有值。

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

 if (!optional.isPresent()) {
    return;
 }

 var key = optional.get();

另外,有人评论说找到a的第一把钥匙HashSet是不可靠的。但是有时候我们有一HashMap对。也就是说,在每张地图中,我们都有一个键和一个值。在这种情况下,快速找到此类对的第一把钥匙很方便。


0

也是一个很好的方法:)

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

-2

您也可以尝试以下操作:

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

1
没有这样的方法
Adrian Grygutis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.