【问题标题】:iterator in a 2Dimensional Map二维地图中的迭代器
【发布时间】:2012-05-16 02:35:40
【问题描述】:

我想知道如何在二维 HashMap 中进行迭代?我正在创建一个 Object TrueStringMap2D,它执行以下操作:它将是一个 2D 地图,我的意思是 2 个键和一个值。

但是这里实现的迭代器不起作用..我不知道如何在 TrueStringMap2D 中重新定义 Iterator 方法:S(如果可能的话应该在 iterator() 函数中删除) 任何人都可以帮忙吗? 非常感谢!!

【问题讨论】:

  • I don't think SO wants to read all of that. 如果您可以缩减代码以适应您的问题范围,那将是一个巨大的好处。
  • 我想重新定义迭代器方法,该方法将迭代包含嵌套地图的地图。 (使用我发布的课程条目)
  • 我回答的是值,而不是条目。您必须调整我的答案才能解决条目。

标签: java map iterator nested


【解决方案1】:

我会将问题重新解释为我喜欢回答的类似问题,然后希望该问题的答案对您有用。

下面是我要回答的问题:

如何编写一个迭代器来遍历Map<String, Map<String, String>> 中的所有值?

这就是我的解决方法:

class TwoDimIterator implements Iterator<String> {

    Iterator<Map<String, String>> outerIter;
    Iterator<String> innerIter = Collections.<String>emptyList().iterator();

    public TwoDimIterator(Map<String, Map<String, String>> twoDimMap) {
        outerIter = twoDimMap.values().iterator();
        advanceInner();
    }

    @Override
    public boolean hasNext() {
        return innerIter.hasNext();
    }

    @Override
    public String next() {
         String toReturn = innerIter.next();
         advanceInner();
         return toReturn;
    }

    private void advanceInner() {
        while (!innerIter.hasNext()) {
            if (!outerIter.hasNext()) {
                innerIter = Collections.<String>emptyList().iterator();
                return;
            }
            innerIter = outerIter.next().values().iterator();
        }
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}

测试代码:

class Test {

    public static void main(String[] args) {

        // Create a map
        Map<String, Map<String, String>> twoDimMap =
                new HashMap<String, Map<String, String>>();

        // Fill it
        Map<String, String> innerA = new HashMap<String, String>();
        innerA.put("1", "A1");
        innerA.put("2", "A2");

        Map<String, String> innerB = new HashMap<String, String>();
        innerB.put("1", "B1");
        innerB.put("2", "B2");

        twoDimMap.put("A", innerA);
        twoDimMap.put("B", innerB);

        // Create an iterator for the values:
        Iterator<String> twoDimIter = new TwoDimIterator(twoDimMap);
        while (twoDimIter.hasNext())
            System.out.println(twoDimIter.next());

    }
}

输出:

A2
A1
B2
B1

【讨论】:

  • 非常感谢您的回答!!但这是一个家庭作业,教授告诉我们不应该使用外部类。我们应该重新定义那个迭代器方法。你能适应我的 TrueStringMap2D 吗?它只是一个方法.. 这就是为什么我发布了接口(包含类条目,我们将仅用于迭代器方法)和我的 TrueStringMap2D.. 你能理解代码吗?这是我应该实施的最后一种方法。谢谢!!
  • 如果是家庭作业,我想我会把剩下的步骤留给你解决。 :)
  • 但它不返回每个条目的 3 个值(key1、key2、值)...它只返回值..:S
  • 对...让它遍历条目实际上是一个微不足道的更改,所以我将它留给你。毕竟是功课。
  • 但是 next() 已经有问题了.. eclipse 说返回类型应该被强制转换为 Entry,当我这样做时,返回变量“toReturn”的错误应该被强制转换为 Entry ,或字符串。如果我将它转换为 String 我将遇到与上面相同的问题,当我将它转换为 Entry 时,“innerIter.next();”错误: toReturn 应该是字符串... :S 我必须在 00:00 之前返回它 :SS 还有其他想法吗?对不起
猜你喜欢
  • 2017-09-15
  • 2019-04-23
  • 2010-12-19
  • 1970-01-01
  • 2023-03-09
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多