Java 访问地图的最佳方式

Java 访问地图的最佳方式,java,map,Java,Map,考虑以下情况: 我有一个以字符串作为键的映射,另一个映射作为值。现在,值中的映射也是一个映射,其中字符串作为键,映射作为值。我们有一些像这样的n个级别,最后一个级别有一个映射,其中字符串作为键,字符串作为值。现在假设,我有每个级别的键列表。我必须得到最后的字符串值 这就是我用java实现它的想法: Object q = initialMap; for(String key : keyList) { Map x = (Map)q; q = x.get(key); } return

考虑以下情况:

我有一个以字符串作为键的映射,另一个映射作为值。现在,值中的映射也是一个映射,其中字符串作为键,映射作为值。我们有一些像这样的n个级别,最后一个级别有一个映射,其中字符串作为键,字符串作为值。现在假设,我有每个级别的键列表。我必须得到最后的字符串值

这就是我用java实现它的想法:

Object q = initialMap; 
for(String key : keyList)
{
    Map x = (Map)q;
    q = x.get(key);
}
return (String)q;

这是正确的方法吗?我得到了未经检查的转换警告。有更好的方法吗?

我想我理解您的问题,您可以从一个文件中获取字符串映射到字符串映射到。。。诸如此类:

 Map<String, Map<String, Map<String, Map<String, String>>>> initialMap;
Object q = initialMap; 
for(String key : keyList)
{
    Map<String, ?> x = (Map<String, ?>)q;
    q = x.get(key);
}
return (String)q;
Map初始映射;
你的问题中不清楚的是,你是否知道地图将有多少层。如果是的话,那么就按照我刚才所做的那样写下你的初始地图(对于4个级别的地图),以获得你所需要的级别数

如果你事先不知道你有多少水平,那就更难了。在这种情况下,您的算法是正确的。我只想让它更像这样的泛型:

 Map<String, Map<String, Map<String, Map<String, String>>>> initialMap;
Object q = initialMap; 
for(String key : keyList)
{
    Map<String, ?> x = (Map<String, ?>)q;
    q = x.get(key);
}
return (String)q;
objectq=initialMap;
用于(字符串键:键列表)
{
Map x=(Map)q;
q=x.get(键);
}
返回(字符串)q;
但这总是会给您一个警告,您必须通过向方法中添加@SuppressWarnings(“未选中”)来抑制该警告

您可以尝试用一种方法将其抽象出来

编辑:有一种方法可以在实用程序类中完全抽象它。我把你想要的称为一种递归映射。您的任何映射都是字符串到字符串的映射,或者是字符串到递归映射的映射。可以这样抽象:

interface IRecursiveMap {
  String get(List<String> keyList);
}

class RecursiveMap implements IRecursiveMap{
  Map<String, IRecursiveMap> map;

  @Override
  public String get(List<String> keyList) {
    String key = keyList.get(0);
    return map.get(key).get(keyList.subList(1, keyList.size()));
  }
}

class ValueMap implements IRecursiveMap{
  Map<String, String> map;

  @Override
  public String get(List<String> keyList) {
    String key = keyList.get(0);
    return map.get(key);
  }
}
接口IRecursiveMap{
字符串get(列表键列表);
}
类RecursiveMap实现IRecursiveMap{
地图;
@凌驾
公共字符串获取(列表键列表){
String key=keyList.get(0);
返回map.get(key).get(keyList.subList(1,keyList.size());
}
}
类ValueMap实现IRecursiveMap{
地图;
@凌驾
公共字符串获取(列表键列表){
String key=keyList.get(0);
返回map.get(key);
}
}
因此,IRecursiveMap是一个接口,它定义了映射的常见行为:从键列表中获取内容的能力。RecursiveMap是将字符串映射到另一个IRecursiveMap的实现,ValueMap是递归的最后一个映射,它实际上将字符串映射到字符串

这种实施的好处是:

  • 代码正确地使用泛型,并且数据是完全类型化的。这意味着你没有更多的通用警告
  • 在这个映射链中存储内容的所有逻辑都抽象在几个实用程序类中

另一方面,缺点是填充映射可能有点复杂,但同样可以递归完成。

我想我理解您的问题,您可以从文件中获得字符串映射到字符串映射到字符串映射的映射。。。诸如此类:

 Map<String, Map<String, Map<String, Map<String, String>>>> initialMap;
Object q = initialMap; 
for(String key : keyList)
{
    Map<String, ?> x = (Map<String, ?>)q;
    q = x.get(key);
}
return (String)q;
Map初始映射;
你的问题中不清楚的是,你是否知道地图将有多少层。如果是的话,那么就按照我刚才所做的那样写下你的初始地图(对于4个级别的地图),以获得你所需要的级别数

如果你事先不知道你有多少水平,那就更难了。在这种情况下,您的算法是正确的。我只想让它更像这样的泛型:

 Map<String, Map<String, Map<String, Map<String, String>>>> initialMap;
Object q = initialMap; 
for(String key : keyList)
{
    Map<String, ?> x = (Map<String, ?>)q;
    q = x.get(key);
}
return (String)q;
objectq=initialMap;
用于(字符串键:键列表)
{
Map x=(Map)q;
q=x.get(键);
}
返回(字符串)q;
但这总是会给您一个警告,您必须通过向方法中添加@SuppressWarnings(“未选中”)来抑制该警告

您可以尝试用一种方法将其抽象出来

编辑:有一种方法可以在实用程序类中完全抽象它。我把你想要的称为一种递归映射。您的任何映射都是字符串到字符串的映射,或者是字符串到递归映射的映射。可以这样抽象:

interface IRecursiveMap {
  String get(List<String> keyList);
}

class RecursiveMap implements IRecursiveMap{
  Map<String, IRecursiveMap> map;

  @Override
  public String get(List<String> keyList) {
    String key = keyList.get(0);
    return map.get(key).get(keyList.subList(1, keyList.size()));
  }
}

class ValueMap implements IRecursiveMap{
  Map<String, String> map;

  @Override
  public String get(List<String> keyList) {
    String key = keyList.get(0);
    return map.get(key);
  }
}
接口IRecursiveMap{
字符串get(列表键列表);
}
类RecursiveMap实现IRecursiveMap{
地图;
@凌驾
公共字符串获取(列表键列表){
String key=keyList.get(0);
返回map.get(key).get(keyList.subList(1,keyList.size());
}
}
类ValueMap实现IRecursiveMap{
地图;
@凌驾
公共字符串获取(列表键列表){
String key=keyList.get(0);
返回map.get(key);
}
}
因此,IRecursiveMap是一个接口,它定义了映射的常见行为:从键列表中获取内容的能力。RecursiveMap是将字符串映射到另一个IRecursiveMap的实现,ValueMap是递归的最后一个映射,它实际上将字符串映射到字符串

这种实施的好处是:

  • 代码正确地使用泛型,并且数据是完全类型化的。这意味着你没有更多的通用警告
  • 在这个映射链中存储内容的所有逻辑都抽象在几个实用程序类中

另一方面,缺点是填充地图可能有点复杂,但同样可以递归完成。

使用迭代器很常见。您可以更改嵌套地图的设计吗?还是来自另一个库?initialMap是如何声明的?热舔:每次循环迭代都会改变q,所以x也是,我认为这是他的算法的要点。@Amit:您正在将映射转换为字符串??通常使用迭代器。您能改变嵌套映射的设计吗?还是来自另一个库?initialMap是如何声明的?热舔:每次循环迭代q都会改变,所以x也是,我想这就是他的算法的要点。@Amit:你正在将一个映射转换为字符串??