【问题标题】:Managing nested maps with string keys使用字符串键管理嵌套映射
【发布时间】:2012-05-19 11:06:18
【问题描述】:

nestedMapput() 方法中创建时,我可以在我的迭代器中访问我的nestedMap,如下所示:

@Override
public String put(final String row, final String column, final String value) {
    /**
     * Second map which is contained by centralMap, that contain Strings as
     * Keys and Values.
     */
    Map<String, String> nestedMap;

    if (centralMap.containsKey(row))
        nestedMap = centralMap.get(row);
    else
        nestedMap = new HashMap<String, String>();
    if (!nestedMap.containsKey(column))
        counter++;
    centralMap.put(row, nestedMap);
    return nestedMap.put(column, value);
}

并且 centralMap 被声明为一个对象变量,

private final Map<String, Map<String, String>> centralMap;

但只是在构造函数中实例化,如下所示:

centralMap = new HashMap<String, Map<String, String>>();

我尝试实现的方法是 remove 方法:

@Override
    public void remove() {
        for (Map<String, String> map : centralMap.values()) {
            map = centralMap.get(keyName);
            iteratorNested.remove();
            if (map.size() <= 0)
                iteratorCentral.remove();
        }
    }

非常感谢!

【问题讨论】:

  • 真的是嵌套地图吗?对我来说,它看起来像是另一个方法局部变量。
  • 哪个迭代器中访问?请举例说明您的意思。
  • 如果你有这样一个 Map,centralMap 和一个嵌套地图,如上所述,只在 put 方法中创建,你将如何访问它?你可以做一个for-each循环,比如for(Map&lt;String,String&gt; map : centralMap.values()) map = ...但是当我不想使用循环时,我必须改变我的方法并将nestedMap作为我的类中的对象变量还是有另一种方法像centralMap.get(****) 一样,我不知道,还有任何其他解决方案可以访问上面实例化的nestedMap?谢谢!

标签: java map iterator hashmap


【解决方案1】:

不确定你到底在问什么,但我认为这更容易阅读:

@Override
public String put(final String row, final String column, final String value) {
    /**
     * Second map which is contained by centralMap, that contain Strings as
     * Keys and Values.
     */
    Map<String, String> nestedMap = centralMap.get(row);
    if (nestedMap == null) {
      nestedMap = new HashMap<String, String>();
      centralMap.put(row,nestedMap);
    }

    if (!nestedMap.containsKey(column))
        counter++;
    centralMap.put(row, nestedMap);
    return nestedMap.put(column, value);
}

我不太明白你在第二节中在做什么,所以无法帮助你改进。而且我没有看到您的问题中提到的迭代器。

您让我猜,但也许在您的程序中的 ELSEWHERE(查看更多代码,以及您正在寻找的特定函数原型或行为声明确实会有所帮助)您希望能够迭代内容centralMap 实例和nestedMap 的嵌套实例。是的,你可以。

public void iterateOverAllNested()
{
   for (Map.Entry<String,Map<String,String>> nested : centralMap) {
     final String centralKey = nested.key();
     final Map<String,String> nestedMap = nested.value();
     System.out.println("Central map row/column: "+centralKey);
     for (Map.Entry<String,String> entry : nestedMap) {
       System.out.println(" key="+entry.key()+", value="+entry.value());
     }
   }
}

请注意,这气味。无类型 Strings 的嵌套映射可能是错误的。你最近有没有机会写 Perl?我建议您编写第二个 SO 问题,询问针对您的特定问题的良好数据结构。您可以将此代码作为您的起点,人们可能会提供更简洁的解决方案。

【讨论】:

  • 来自 OP 之前的问题:“我们有一个作业,要实现一个类,它会创建一个对象,该对象将是字符串的二维映射。”
  • @Marko:我想我会带上帽子回家。
  • 这是我试图实现的方法:@Override public void remove() { for (Map map : centralMap.values()) { map = centralMap.get(keyName) ; iteratorNested.remove(); if (map.size()
猜你喜欢
  • 2011-12-05
  • 2016-08-06
  • 2017-05-27
  • 2019-08-30
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
相关资源
最近更新 更多