簡體   English   中英

使用鍵和值存儲 3 個值,例如 hashmap

[英]storing 3 values like hashmap using key and value

我正在嘗試使用其屬性存儲一個臨時值,如示例中所示:

String -> IN_LOBBY      -> true
          IN_MID_GAME   -> false
          IN_DEATHMATCH -> false

我像這樣制作了 hashmap 但不知道如何使用它:

HashMap<String, HashMap<String, Boolean>> games = new HashMap<>();

該函數的屬性有點像 HashMap。 我知道該怎么做,我需要幫助。

只需使用Map

如果您不需要訪問特定於HashMap的任何方法,則可以僅使用Map定義您的 map 。 這樣做使您能夠在不破壞調用代碼的情況下更改您對特定Map實現的選擇。

Map < String, Map < SportMode, Boolean > > games = new HashMap <>();

枚舉

從您的示例看起來, IN_LOBBY等值可以定義為枚舉。 當您在編譯時已知的可能值數量有限時,枚舉是合適的。 使用枚舉提供類型安全,確保有效值,並使您的代碼更具自我記錄性 請參閱Oracle 的教程

package work.basil.example;

public enum SportMode
{
    IN_LOBBY , IN_MID_GAME , IN_DEATHMATCH
}

不可修改的地圖

如果您想要嵌套不可修改的地圖,請使用Map.of 9 及更高版本中的 Map.of。

Map.of方法提供簡單的文字語法,傳遞一系列鍵值對。 在我們的例子中,這些對是字符串,map,字符串,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=真}}

可修改的地圖

如果您的嵌套映射必須是可修改的,我仍然會使用Map.of來獲取其方便的文字語法,但將其提供給另一個Map實現的構造函數。 在我們的例子中,嵌套的 map 的鍵是在枚舉中定義的,因此請使用EnumMap ,因為它針對快速速度和低 memory 使用率進行了高度優化,並以枚舉定義的順序保持其鍵。

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=真}}

修改第一個嵌套的 map 的第三個元素。

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=真}}

Map實現

如果您想保持AliceBobCarol鍵的排序順序,請使用SortedMap / NavigableMap實現,例如外部 map 的TreeMap

如果要保留將鍵添加到外部 map 的順序,請使用LinkedHashMap

與 Java 11 捆綁的 Map 實現表

你可以像這樣使用它:

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

您可以使用Mapputget方法來添加或檢索鍵和值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM