3

再帰的にトラバースする方法はありますか?HashMapそれvalue1key1実際には新しいものであり、key2それを返すvalue2のは次key3のようになります...それが戻るまで。nullロジックは次のとおりです。

hm.get(key)
hm.get(hm.get(key))
hm.get(hm.get(hm.get(key)))
......

これは何らかの再帰手順で実行できると思いますか?私が間違っていたら訂正してください。ありがとう!

4

3 に答える 3

2

これはあなたが手順を望んでいたものですか?ハッシュマップをトラバースすることにより、最終的な値を返します。

 Public Object traverseMap(Object key)
    while(hm.get(key) != null){
      key = hm.get(key);
    }
    return key;
 }
于 2012-05-01T06:56:59.150 に答える
1

ハッシュマップがこのように設定されている場合(つまり、別の値のキーでもある値が含まれている場合)、それは可能です。これは再帰的な方法で行うことができますが、ループで十分です。

Object key = someInitialKey;
Object value = null;
do {
  value = hm.get( key );
  key = value;
} while( value != null );
于 2012-05-01T06:55:15.563 に答える
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);
    }
}
于 2012-05-01T07:07:26.060 に答える