我正在尝试存储一个临时值和它的属性,如示例中的show:
String -> IN_LOBBY -> true
IN_MID_GAME -> false
IN_DEATHMATCH -> false我做了一个这样的hashmap,但我不知道如何使用它:
HashMap<String, HashMap<String, Boolean>> games = new HashMap<>();该函数的属性有点像HashMap。我知道怎么做这件事,我需要帮助。
发布于 2020-06-22 13:03:05
只需使用Map即可
如果不需要访问任何特定于HashMap的方法,则可以仅使用Map来定义映射。这样做可以让您在不中断调用代码的情况下更改特定Map实现的选择。
Map < String, Map < SportMode, Boolean > > games = new HashMap <>();枚举
从您的示例看,可以将IN_LOBBY等值定义为枚举。当编译时已知的可能值的数量有限时,枚举是合适的。使用枚举可以提供type-safety,确保有效的值,并使代码更具self-documenting。参见tutorial by Oracle。
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、…。
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 ) );转储到控制台。
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,因为它针对快速和低内存使用进行了高度优化,并以枚举定义的顺序保留其键。
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}}
修改第一个嵌套地图的第三个元素。
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实现
如果希望保持Alice、Bob和Carol键的排序顺序,请对外部映射使用SortedMap/NavigableMap实现,如TreeMap。
如果要保留将键添加到外部映射的顺序,请使用LinkedHashMap。

发布于 2020-06-22 12:22:36
你可以这样使用它:
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发布于 2020-06-22 13:56:06
您可以使用Map的put和get方法来添加或检索键和值。
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"));https://stackoverflow.com/questions/62507363
复制相似问题