2010-06-03 2 views
3

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

благодаря

редактировать Амиром 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); 
     } 
    } 
} 
+1

Почему не разместить его здесь? Вы можете опубликовать свой код, и сайт будет отформатировать его для вас, если вы добавите дополнительный 4-х промежуточный отступ. – OscarRyz

+0

извинения У меня был только образ кодировки, но если вы щелкните правой кнопкой мыши изображение и выберите «Просмотреть изображение», он будет в полном размере. – user357966

+0

@Support - многоязычный SO - спасибо за редактирование на мое имя. –

ответ

5

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

+0

спасибо, что имеет смысл, я вижу, где я ошибся, так как я его смутил со стеком! – user357966

2

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

Если карта пуста это вернуть 11

Итак: 9+7+5+3+1+11 = (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

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

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

это повторяется до пустой whne oddOne return 11

поэтому мы закончили с

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

фактически заказ будет е все перемешалось, так как это HashMap, но это не имеет никакого влияния на добавление чисел

0

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

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

Посмотрите на рекурсии: http://en.wikipedia.org/wiki/Recursion

+0

Спасибо, ребята, очень ценю всю помощь. – user357966