Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从用户输入的嵌套HashMap中检索值_Java_Hashmap - Fatal编程技术网

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

Java 从用户输入的嵌套HashMap中检索值,java,hashmap,Java,Hashmap,我试图根据用户选择从嵌套哈希映射中检索值。我从嵌套哈希映射中获取值时遇到问题 我创建了如下的HashMap private Map<String, Map<String, String>> contentTypesMap = new HashMap<String, Map<String, String>>(); 以您的示例为例,如果选择是“MDX”,您可以通过执行 HashMap selection=contentTypesMap.get(“MD

我试图根据用户选择从嵌套哈希映射中检索值。我从嵌套哈希映射中获取值时遇到问题

我创建了如下的HashMap

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

以您的示例为例,如果选择是“MDX”,您可以通过执行
HashMap selection=contentTypesMap.get(“MDX”)


然后,您可以使用entrySet()方法检索映射的所有条目并对条目进行迭代。

HELLO1和FOO是MDX的值吗

你说的不对。试试这个:

Map<String, String> value = new HashMap<String, String>();
value.put("HELLO1", "FOO");
contentTypesMap.put("MDX", value);
Map value=newhashmap();
价值。看跌期权(“HELLO1”、“FOO”);
contentTypesMap.put(“MDX”,值);

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

< P>参见Mult.PoT(K键,V值)

的文档。 @返回与键关联的上一个值,或 如果没有键的映射,则为null

因此,调用
contentTypesMap.put(“MDX”,new HashMap())
将始终返回
contentTypesMap
映射中不再存在的值

解决方案:

HashMap<String, String> map = contentTypesMap.get("MDX"); 
if (map == null) {
    map = new HashMap<>();
    contentTypesMap.put("MDX", map);
}
map.put("HELLO1", "FOO");
HashMap=contentTypesMap.get(“MDX”); if(map==null){ map=新的HashMap(); contentTypesMap.put(“MDX”,映射); } 地图放置(“HELLO1”、“FOO”);
或者您可以使用guava Multimap来代替。

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

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);
    }
}
公共类数据库表{
私有映射dbTables=newhashmap();
public void addColumn(字符串表名、字符串列、字符串类型){
Map columns=dbTables.get(tableName);
if(dbTables.get(tableName)==null){
columns=newhashmap();
}
columns.put(column,type);
put(tableName,columns);
}
公共映射getColumnsForTable(字符串表名){
返回dbTables.get(tableName);
}
}
但那感觉还是很难看。我认为比这更好的解决方案是有一个名为Table的类,表名有一个string属性,列和数据类型有一个映射

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


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

HashMap#put
返回==>>“与键关联的上一个值,如果键没有映射,则返回null。(null返回也可以指示映射以前与键关联的null)。”是的,使用Hell1和FOO作为HashMap的虚拟数据,您能澄清一下如何将外部映射包装到它自己的对象中吗please@Chrisput方法返回一个字符串,所以不能将其用于类型映射噢,是的,我觉得这样做很愚蠢。不过,我发布的两件事情中的第一件应该是可行的。“现在将编辑它。@furquanahmad想到这一点是因为我最近在一次代码审查中被告知同样的事情。”。包装它可以提供更多关于地图内容的信息,如果你在这样的集合中有一个集合,这是一个好主意。您在地图中存储的确切内容是什么?你能发布一些与实际数据相似的虚拟数据吗?我会看看我是否能想出一个例子。我会为数据库存储表名和列数据。谢谢你,克里斯
HashMap<String, String> map = contentTypesMap.get("MDX"); 
if (map == null) {
    map = new HashMap<>();
    contentTypesMap.put("MDX", map);
}
map.put("HELLO1", "FOO");
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);
    }
}