помощь с хэш-картой Java - PullRequest
3 голосов
/ 04 июня 2010

Может кто-нибудь объяснить, что происходит в приведенном ниже коде и как это заканчивается 36?

спасибо

edit by Amir Rachum

public class HashMap2009 {
    public static void main (String[] args) {
        Map<String, Integer> myMap2009 = 
            new HashMap<String, Integer>();
        myMap2009.put("one", new Integer(1));
        myMap2009.put("three", new Integer(3));
        myMap2009.put("five", new Integer(5));
        myMap2009.put("seven", new Integer(7));
        myMap2009.put("nine", new Integer(9));
        System.out.println(oddOne(myMap2009));
    }
    private static int oddOne(Map<String, Integer> myMap2009) {
        if (myMap2009.isEmpty())
            return 11;
        else {
            Set<String> st = myMap2009.keySet();
            String key = st.iterator().next();
            int num = myMap2009.get(key);
            myMap2009.remove(key);
            return num + oddOne(myMap2009);
        }
    }
}

Ответы [ 4 ]

5 голосов
/ 04 июня 2010

Это простой пример рекурсии , который приводит к суммированию всех ключей на карте один за другим, а когда карта пуста, добавляет еще 11. Это суммирует до 36.

2 голосов
/ 04 июня 2010

Это рекурсивная функция, которая при каждом вызове добавляет значение первого элемента на карте, а затем удаляет его.

Если карта пуста, возвращается 11

Итак: 9+7+5+3+1+11 = 36 (9,7,5,3,1 для каждого значения на карте и 11 для пустого)

Кстати, для меня это ужасный способ учить рекурсии (потому что карта создает слишком много шума)

Более простой (и я думаю, более эффективный) способ был бы:

import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
public class ArrayList2009 {
    public static void main( String [] args ) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(9);
        System.out.println( addOne( list ) );                        
    }
    private static int addOne( List<Integer> list ){
        if ( list.isEmpty() ) {
            return 11;
        } else {
            Iterator<Integer> i = list.iterator();
            int num = i.next();
            i.remove();
            return num + addOne( list );
        }
    }
}

Что делает то же самое, но вносит меньше шума, потому что интерфейс List проще для понимания.

0 голосов
/ 04 июня 2010

Вы делаете рекурсивные вызовы, удаляя один элемент с карты за вызов.

Вы можете начать с num == 1 (карта неупорядочена), и вы удалите ее со своей карты. Затем вы делаете рекурсивный вызов, который дает вам num == 3. Это продолжается до тех пор, пока ваша карта не станет пустой, что приводит к 1 + 3 + 5 + 7 + 9 и дополнительным 11 для вашей пустой карты.

Взгляните на рекурсию: http://en.wikipedia.org/wiki/Recursion

0 голосов
/ 04 июня 2010

При вызове oddOne он получит

  • первое число
  • удалить номер
  • добавить его к результату oddOne (с удаленным номером)

это повторяется до тех пор, пока не будет пусто, когда нечетное возвращение 11

так что в итоге мы получим

1 + (3 + (5 + (7 + (9 + 11))))) = 36

на самом деле порядок будет перемешан, поскольку это хеш-карта, но это не влияет на добавление чисел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...