2012-05-01 2 views
3

Есть ли способ рекурсивно пересекать HashMap так, что value1 из key1 фактически новый key2, который возвращает value2, что снова будет следующий key3 и так далее ... пока она не возвращается null? Логика такова:Рекурсивно перемещаться по HashMap?

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

Я предполагаю, что это может быть сделано с помощью какой-либо процедуры рекурсии? Пожалуйста, поправьте меня, если я ошибаюсь. Благодаря!

+0

Да. Он разработан таким образом. Не могли бы вы дать какой-то код? Либо цикл, либо рекурсия? Благодаря! – Rock

+0

Я переместил свой комментарий в ответ с кодом. – Thomas

+2

Если конечный результат всегда равен нулю, лучше написать 'String endValue = null', а не использовать ваш алгоритм. Какой смысл «пересекать» карту, если вы ничего не делаете с каждым значением? –

ответ

2

Это тот, который вы хотели получить? он возвращает значение конечного путем обхода HashMap:

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

* «... он вернет конечное значение» * - если не существует цикла, и в этом случае это приведет к бесконечному циклу. –

1

Если хешмап будет настроен таким образом (то есть он содержит значение, которое также является ключом для другого значения), это было бы возможно. Вы можете сделать это в рекурсивном методе, но достаточно петли:

Object key = someInitialKey; 
Object value = null; 
do { 
    value = hm.get(key); 
    key = value; 
} while(value != null); 
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); 
    } 
} 
Смежные вопросы