【问题标题】:Compare hashMap values比较 hashMap 值
【发布时间】:2013-03-22 19:33:36
【问题描述】:

我正在练习一些面试问题,但不知道如何比较 hashMap 值。前提是你有一本带字符串的杂志。您必须从杂志中剪下适当数量的字符以形成赎金票据。我已经设法将字符和字符的出现次数都添加到 hashMap 但如何比较两个 hashMap 以确定我有足够的字母。任何指导将不胜感激。

杂志 = {g=2, =14, d=2, e=2, a=4, n=1, o=5, l=4, m=1, .=1, k=1, I =2, h=2, i=6, w=1, T=1, u=1, t=2, s=3, r=1, y=2} 赎金 = {w=1, =3, o=1, l=4, k=1, I=1, y=1, i=2}

String mag = "this is what I said Im going to do. i really like you a lot";
        String ransom = "i will kill you";

        Map<Character,Integer> map = new HashMap<Character,Integer>();
        Map<Character,Integer> ransomMap = new HashMap<Character,Integer>();

        for(int i = 0; i < mag.length() -1; i++)
        {
            char c = mag.charAt(i);
            if(!map.containsKey(c))
            map.put(c, 1);
            else{
                int value = map.get(c);
                map.put(c,++value);
            }
        }

        System.out.println(map);

        for(int i = 0; i < ransom.length()-1; i++ )
        {
        char c = ransom.charAt(i);
        if(!ransomMap.containsKey(c))
            ransomMap.put(c,1);
        else
        {
            int value = (ransomMap.get(c));
            ransomMap.put(c,++value);
        }
        }
        System.out.println(ransomMap);
    }

【问题讨论】:

    标签: java hashmap compare


    【解决方案1】:

    检查你的赎金信中的每一个字母,看看报纸上是否有足够的内容:

    boolean enoughLetters(Map<Character, Integer> magMap, Map<Character,Integer> ransomMap) {
        for( Entry<Character, Integer> e : ransomMap.entrySet() ) {
            Character letter = e.getKey();
            Integer available = magMap.get(letter);
            if (available == null || e.getValue() > available) return false;
        }
        return true;
    }
    

    【讨论】:

    • 谢谢,效果很好。就这样我清楚地理解了解决方案,对于 ransomHashMap 中的每个条目,您首先获取密钥(字母),然后在杂志哈希图中查找完全相同的密钥,同时提取附加值。如果杂志值为 null 或小于当前条目值 boolean false。如果杂志键不存在,是否不会导致某种错误。
    • 如果杂志键不存在,那么您将拥有available == null
    • +1,但如果您像我一样尝试避免空检查,您可以使用containsKey()if (!magMap.containsKey(letter) || magMap.get(letter).getValue() &gt; available) return false;
    • 如果我最终还是要拿到钥匙,我通常不会做containsKey()。可能是过早的优化,但已经过时了。 :)
    【解决方案2】:

    安德鲁的回答有效。但我通过使用(测试驱动开发)TDD 解决了这个问题。以下是我提出的测试:

    @Test
    public void whenMagazineHasLessCharactersThanRansomThenYouCanCreateRansom() {
        assertFalse(canMakeRansom("abcdef", "abcdefg"));
    }
    
    @Test
    public void whenMagazineHasSameCharactersOfRansomThenYouCanCreateRansom() {
        assertTrue(canMakeRansom("abcdefg", "abcdefg"));
    }
    
    @Test
    public void whenMagazineHasSameCharactersOfRansomButInDifferentOrderThenYouCanCreateRansom() {
        assertTrue(canMakeRansom("abcdefg", "gfedcab"));
    }
    
    @Test
    public void whenMagazineHasSameCharactersOfRansomButHasMoreThenYouCanCreateRansom() {
        assertTrue(canMakeRansom("aabbccdefg", "agfedcab"));
    }
    
    @Test
    public void whenMagazineHasSameCharactersOfRansomButRansomHasMoreThenYouCantCreateRansom() {
        assertFalse(canMakeRansom("aabbccdefg", "aaaaagfedcab"));
    }
    

    左边参数是杂志,右边是赎金。这太大了,无法作为评论发布,所以我正在使用答案。

    private boolean canMakeRansom(String magazine, String ransom) {
        Map<Character, Integer> magList = createCharCountMap(magazine);
        Map<Character, Integer> ransomList = createCharCountMap(ransom);
        return magHasAtLeastTheseCharacters(magList, ransomList);   //Andrew's implementation
    }
    
    private Map<Character, Integer> createCharCountMap(String chars) {
        HashMap<Character, Integer> charCountMap = new HashMap<Character, Integer>();
        for (char c : chars.toCharArray()) {
            if (charCountMap.containsKey(c)) {
                charCountMap.put(c, charCountMap.get(c) + 1);
            } else {
                charCountMap.put(c, 1);
            }
        }
        return charCountMap;
    }
    

    【讨论】:

    • 测试驱动开发,这意味着(简单地说)在开发之前定义您的测试用例。
    • 我没有想出所有这些很酷的首字母缩略词来表示良好的编程习惯......但无论如何,你的 canMakeRansom 函数在哪里?
    • 你还没有magHasAtLeastTheseCharacters
    【解决方案3】:

    如果我正确理解了这个问题。您可能可以检查所有字符 [ a-z A-Z 0-9 !@#$%^&()(_+{:? ]。

    【讨论】:

    • 我不认为你理解这个问题 - 他在问如何比较他得到的两张地图,他的map 中是否有足够的字母来从中生成ransom
    • 是的。循环ranson的关键很有意义:)
    猜你喜欢
    • 1970-01-01
    • 2017-06-25
    • 2011-12-16
    • 2021-08-14
    • 1970-01-01
    • 2018-10-31
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多