从用户输入中检索嵌套HashMap中的值

时间:2016-07-22 09:21:53

标签: java hashmap

我正在尝试从嵌套的hashmap中检索值,具体取决于用户选择。我无法从嵌套的Hashmap中获取值。

我已经像这样创建了HashMap

private Map<String, Map<String, String>> contentTypesMap = new HashMap<String, Map<String, String>>();

如果用户选择MDX,我想转到嵌套的HashMap,并在第二个hashmap中获取两个字符串值。

contentTypesMap.put("MDX", new HashMap<String,String>()).put("HELLO1", "FOO");

这是我在哪里使用hashmap的函数,

public void getDatabaseSelectionValues (){
  resourceType = (String) FileUtilityScreen.contentTypes.getSelectedItem();
  sqlTableName = contentTypesMap.get(resourceType).get(key);
  languageSelected = FileUtilityScreen.languagesFromDataBase.get(
  FileUtilityScreen.languageDropDown.getSelectedItem());
}

4 个答案:

答案 0 :(得分:0)

以你的例子为例,如果选择是“MDX”,你就可以得到你的第二张地图 HashMap<String,String> selection = contentTypesMap.get("MDX")

然后您可以使用entrySet()方法检索地图的所有条目并迭代条目。

答案 1 :(得分:0)

HELLO1和FOO是否是MDX的值?

你说的不对。试试这个:

Map<String, String> value = new HashMap<String, String>();
value.put("HELLO1", "FOO");
contentTypesMap.put("MDX", value);

我也考虑将这个外部地图包装在它自己的对象中,因为它可能变得复杂。

答案 2 :(得分:0)

请参阅Map.put(K键,V值)

中的文档
  

@return与key关联的先前值,或        如果没有键的映射

,则返回null

因此,调用contentTypesMap.put("MDX", new HashMap<String,String>())将始终返回不在contentTypesMap地图中的值。

解决方案:

HashMap<String, String> map = contentTypesMap.get("MDX"); 
if (map == null) {
    map = new HashMap<>();
    contentTypesMap.put("MDX", map);
}
map.put("HELLO1", "FOO");

或者您可以改用番石榴Multimap。

答案 3 :(得分:0)

我在上面评论中的包装类的意思是这些内容,以使其更具可读性。我假设外部映射中的键是表名,而内部映射中是该列的列名和数据类型。

public class DatabaseTables {

    private Map<String, Map<String, String>> dbTables = new HashMap<String, Map<String, String>>();

    public void addColumn(String tableName, String column, String type){
        Map<String, String> columns = dbTables.get(tableName);

        if(dbTables.get(tableName) == null) {
            columns = new HashMap<String, String>();
        }

        columns.put(column, type);
        dbTables.put(tableName, columns);
    }

    public Map<String,String> getColumnsForTable(String tableName){
        return dbTables.get(tableName);
    }
}
但是,这仍然让人觉得难看。我认为比这更好的解决方案是拥有一个名为Table的类,其中包含表名的字符串属性,以及其列和数据类型的映射。

然后,在其他地方,你可以有一个列表或一组类型表。

编辑:或者,在Table.java中,您可以使用列表或类型列的列表,而不是列的映射。然后创建一个包含两个字段的列类,一个用于列名,另一个用于类型。