2010-06-03 106 views
3

有人可以解释下面代码中发生了什么,以及它如何以36结尾?有关java哈希映射的帮助

感谢

编辑阿米尔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 2010-06-03 22:36:47

+0

道歉我只有一个编码图像,但如果你右键单击图像并选择“查看图像”,它将是全尺寸。 – user357966 2010-06-03 22:39:18

+0

@Support - 多语言SO - 感谢我的名字编辑。 – 2010-06-03 22:58:07

回答

5

这是recursion一个简单的例子,这导致在由一个和在地图一个加入了所有的键时映射为空,它增加了另一个11.这总计高达36.

+0

谢谢,这是有道理的,我看到我要去哪里错了,因为我有它与堆栈混淆! – user357966 2010-06-03 22:43:37

2

这是一个recursive函数,每次调用时,都会将第一个元素的值添加到地图中,然后将其删除。 (用于当它是空的9,7,5,3,1在图中的每个值和11)

9+7+5+3+1+11 =

如果映射为空,它返回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的结果(除去数)

这种重复,直到empty 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 2010-06-03 22:49:12