【问题标题】:help with java hash mapjava哈希图的帮助
【发布时间】:2010-06-03 22:33:04
【问题描述】:

谁能解释一下下面代码中发生了什么以及它是如何以 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);
        }
    }
}

【问题讨论】:

  • 你为什么不把它贴在这里?您可以发布您的代码,如果您添加额外的 4 个空格缩进,网站将为您格式化。
  • 抱歉,我只有编码的图像,但是如果您右键单击图像并选择“查看图像”,它将是全尺寸的。
  • @Support - 多语言 SO - 感谢您以我的名义进行编辑。

标签: java hashmap


【解决方案1】:

这是recursion 的一个简单示例,它导致将映射中的所有键一一相加,当映射为空时,它会再添加 11。总计为 36。

【讨论】:

  • 谢谢你说的有道理,我知道我哪里出错了,因为我把它和堆栈搞混了!!
【解决方案2】:

这是一个recursive 函数,每次调用它时,都会添加映射中第一个元素的值,然后将其删除。

如果地图为空,则返回 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 界面更易于理解。

【讨论】:

    【解决方案3】:

    调用oddOne时会得到

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

    当oddOne 返回 11 时重复此操作直到为空

    所以我们结束了

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

    实际上顺序会因为它是一个哈希图而变得混乱,但这对添加数字没有影响

    【讨论】:

      【解决方案4】:

      您正在进行递归调用,每次调用从地图中删除一个元素。

      您可以从 num == 1(地图无序)开始,然后将其从地图中删除。然后你进行递归调用,得到 num == 3。这会一直持续到你的地图为空,这导致 1 + 3 + 5 + 7 + 9,以及额外的 11 为你的空地图。

      看看递归:http://en.wikipedia.org/wiki/Recursion

      【讨论】:

      • 谢谢大家,非常感谢所有的帮助。
      猜你喜欢
      • 2011-03-24
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2011-04-01
      • 1970-01-01
      • 2011-07-04
      • 2014-02-01
      相关资源
      最近更新 更多