递归遍历HashMap?

3
有没有一种递归遍历HashMap的方法,使得key1的value1实际上是新的key2,返回value2,再次成为下一个key3,以此类推,直到返回null?逻辑如下:
hm.get(key)
hm.get(hm.get(key))
hm.get(hm.get(hm.get(key)))
......

我假设这可以通过递归程序完成?如果我错了,请纠正我。谢谢!


是的,它是这样设计的。你能给一些代码吗?无论是循环还是递归都可以。谢谢! - Rock
我将我的评论与代码一起转移到了答案中。 - Thomas
2
如果最终结果总是null,最好写String endValue = null而不是使用算法。如果您不对每个值执行任何操作,那么“遍历”地图的意义是什么? - JB Nizet
我会选择Jammy的答案,但想知道一件事,使用哈希映射的方式是否正确,当然从逻辑上讲是可能的。 - Amitg2k12
小心无限循环。小心无限循环。小心无限循环。 - Thomas Eding
显示剩余2条评论
3个回答

1
如果哈希映射被设置为这种方式(即它包含一个值,该值也是另一个值的键),那么就可以实现。您可以使用递归方法来完成,但循环也足够了:
Object key = someInitialKey;
Object value = null;
do {
  value = hm.get( key );
  key = value;
} while( value != null );

1

这是你想要的程序吗?它将通过遍历哈希表返回最终值:

 Public Object traverseMap(Object key)
    while(hm.get(key) != null){
      key = hm.get(key);
    }
    return key;
 }

“...它将返回最终值” - 除非存在循环,否则这将导致无限循环。 - Stephen C

1

无论如何,这就是你要求的(尾部!)递归版本:

public class Qsdf {

    public static Object traverseMap(Map m, Object key) {
        return traverseMap(m, key, new HashSet());
    }

    public static Object traverseMap(Map m, Object key, Set traversed) {
        if (key == null) { // first key has to be null
            throw new NullPointerException();
        }
        traversed.add(key);
        Object value = m.get(key);
        if (traversed.contains(value)) { // added after Stephen C's comment on other answer
            // cycle found, either throw exception, return null, or return key
            return key;
        }
        return value != null ?
                traverseMap(m, value, traversed) :
                key; // I guess you want to return the last value that isn't also a key
    }

    public static void main(String[] args) {
        final HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
        m.put(0, 1);
        m.put(1, 2);
        m.put(3, 4);
        m.put(2, 3);
        final Object o = traverseMap(m, 0);
        System.out.println(o);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接