首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储3个值,如使用键和值的hashmap

存储3个值,如使用键和值的hashmap
EN

Stack Overflow用户
提问于 2020-06-22 12:17:08
回答 3查看 73关注 0票数 0

我正在尝试存储一个临时值和它的属性,如示例中的show:

代码语言:javascript
复制
String -> IN_LOBBY      -> true
          IN_MID_GAME   -> false
          IN_DEATHMATCH -> false

我做了一个这样的hashmap,但我不知道如何使用它:

代码语言:javascript
复制
HashMap<String, HashMap<String, Boolean>> games = new HashMap<>();

该函数的属性有点像HashMap。我知道怎么做这件事,我需要帮助。

EN

回答 3

Stack Overflow用户

发布于 2020-06-22 13:03:05

只需使用Map即可

如果不需要访问任何特定于HashMap的方法,则可以仅使用Map来定义映射。这样做可以让您在不中断调用代码的情况下更改特定Map实现的选择。

代码语言:javascript
复制
Map < String, Map < SportMode, Boolean > > games = new HashMap <>();

枚举

从您的示例看,可以将IN_LOBBY等值定义为枚举。当编译时已知的可能值的数量有限时,枚举是合适的。使用枚举可以提供type-safety,确保有效的值,并使代码更具self-documenting。参见tutorial by Oracle

代码语言:javascript
复制
package work.basil.example;

public enum SportMode
{
    IN_LOBBY , IN_MID_GAME , IN_DEATHMATCH
}

不可修改的映射

如果希望嵌套non-modifiable maps,请使用Java9及更高版本中的Map.of

Map.of方法提供简单的文字语法,传递一系列键-值对。在我们的示例中,对是string、map、string、map、…。

代码语言:javascript
复制
games.put( 
    "Alice" , 
    Map.of( SportMode.IN_LOBBY , Boolean.TRUE , SportMode.IN_MID_GAME , Boolean.FALSE , SportMode.IN_DEATHMATCH , Boolean.FALSE ) 
);
games.put( "Bob" , Map.of( SportMode.IN_LOBBY , Boolean.TRUE , SportMode.IN_MID_GAME , Boolean.TRUE , SportMode.IN_DEATHMATCH , Boolean.FALSE ) );
games.put( "Carol" , Map.of( SportMode.IN_LOBBY , Boolean.TRUE , SportMode.IN_MID_GAME , Boolean.TRUE , SportMode.IN_DEATHMATCH , Boolean.TRUE ) );

转储到控制台。

代码语言:javascript
复制
System.out.println( "games.toString(): " + games );

games.toString():{Bob={IN_DEATHMATCH=false,IN_LOBBY=true,IN_MID_GAME=true},Alice={IN_DEATHMATCH=false,IN_LOBBY=true,IN_MID_GAME=false},Carol={IN_DEATHMATCH=true,IN_LOBBY=true,IN_MID_GAME=true}}

可修改的地图

如果您的嵌套映射必须是可修改的,我仍然会使用Map.of作为其方便的文字语法,但将其提供给另一个Map实现的构造器。在我们的示例中,嵌套映射的键是在枚举中定义的,因此使用EnumMap,因为它针对快速和低内存使用进行了高度优化,并以枚举定义的顺序保留其键。

代码语言:javascript
复制
Map < String, Map < SportMode, Boolean > > games = new HashMap <>();

games.put( 
    "Alice" , 
    new EnumMap <>( 
        Map.of( SportMode.IN_LOBBY , Boolean.TRUE , SportMode.IN_MID_GAME , Boolean.FALSE , SportMode.IN_DEATHMATCH , Boolean.FALSE ) 
    ) 
);
games.put( "Bob" , new EnumMap <>( Map.of( SportMode.IN_LOBBY , Boolean.TRUE , SportMode.IN_MID_GAME , Boolean.TRUE , SportMode.IN_DEATHMATCH , Boolean.FALSE ) ) );
games.put( "Carol" , new EnumMap <>( Map.of( SportMode.IN_LOBBY , Boolean.TRUE , SportMode.IN_MID_GAME , Boolean.TRUE , SportMode.IN_DEATHMATCH , Boolean.TRUE ) ) );

games.toString():{Bob={IN_LOBBY=true,IN_MID_GAME=true,IN_DEATHMATCH=false},Alice={IN_LOBBY=true,IN_MID_GAME=false,IN_DEATHMATCH=false},Carol={IN_LOBBY=true,IN_MID_GAME=true,IN_DEATHMATCH=true}}

修改第一个嵌套地图的第三个元素。

代码语言:javascript
复制
games.get( "Alice" ).replace( SportMode.IN_DEATHMATCH , Boolean.TRUE );

games.toString():{Bob={IN_LOBBY=true,IN_MID_GAME=true,IN_DEATHMATCH=false},Alice={IN_LOBBY=true,IN_MID_GAME=false,IN_DEATHMATCH=true},Carol={IN_LOBBY=true,IN_MID_GAME=true,IN_DEATHMATCH=true}}

Map实现

如果希望保持AliceBobCarol键的排序顺序,请对外部映射使用SortedMap/NavigableMap实现,如TreeMap

如果要保留将键添加到外部映射的顺序,请使用LinkedHashMap

票数 2
EN

Stack Overflow用户

发布于 2020-06-22 12:22:36

你可以这样使用它:

代码语言:javascript
复制
games.put("string", new HashMap<String, Boolean>());
games.get("string").add("In_lobby", true); // here we get the hashmap that corresponds do string and we add "in_lobby" to it
//... etc
票数 0
EN

Stack Overflow用户

发布于 2020-06-22 13:56:06

您可以使用Mapputget方法来添加或检索键和值。

代码语言:javascript
复制
HashMap<String, HashMap<String, Boolean>> games = new HashMap<>();
HashMap<String, Boolean> values = new HashMap<>();
        
values.put("IN_LOBBY", true);
values.put("IN_MID_GAME", false);
values.put("IN_DEATHMATCH", false);
        
games.put("String", values);
        
System.out.println(games.get("String").get("IN_MID_GAME"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62507363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档