Java哈希映射的帮助

3

请有人能解释一下下面代码中发生了什么,以及它是如何最终得出36的吗?

谢谢

编辑 由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);
        }
    }
}

1
你为什么不在这里发布呢?如果你添加额外的4个空格缩进,你可以发布你的代码并且网站会为你格式化它。 - OscarRyz
抱歉,我只有一张编码的图片,但如果您右键单击该图片并选择“查看图像”,它将是全尺寸的。 - user357966
@支持 - 多语言 SO - 感谢您代表我进行编辑。 - Amir Rachum
4个回答

5
这是一个关于递归的简单示例,它将逐个添加地图中的所有键,当地图为空时,它会再添加11。这总计为36。

谢谢,这很有道理,我明白我错在哪里了,因为我把它和堆栈混淆了!! - user357966

2
这是一个递归函数,每次调用时,它会添加映射中的第一个元素的值,然后将其删除。
如果映射为空,则返回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

调用oddOne时,它将会得到:

  • 第一个数字
  • 删除该数字
  • 将其添加到oddOne的结果中(已删除该数字)

这个过程会一直重复,直到为空,当oddOne返回11时。

所以我们最终得到:

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

实际上,顺序会被打乱,因为它是哈希映射,但这不会影响加法运算。


0
你正在进行递归调用,每次调用都会从地图中删除一个元素。
你可以从num == 1(映射是无序的)开始,并将其从地图中删除。 然后进行递归调用,这将使您的num == 3。 这将继续进行,直到您的地图为空,这将导致1 + 3 + 5 + 7 + 9,以及空地图的额外11。
看看递归:http://en.wikipedia.org/wiki/Recursion

谢谢大家,非常感谢你们的帮助。 - user357966

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接