我正在尝试从嵌套的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());
}
答案 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中,您可以使用列表或类型列的列表,而不是列的映射。然后创建一个包含两个字段的列类,一个用于列名,另一个用于类型。