我如何一次迭代两个HasMap,我想比较两个hashmap的值

问题描述 投票:0回答:1

这是我为同构字符串制作的半代码,

    public boolean isIsomorphic(String s, String t) {
        String[] ss=s.split("");
        String[] tt=t.split("");
        HashMap<String, Integer> smap=new HashMap<>();
        HashMap<String, Integer> tmap=new HashMap<>();
        int tint,sint;
        for(int i=0;i<ss.length;i++){
            if(!smap.containsKey(ss[i])){
                smap.put(ss[i], 1);
            }else{
                sint=smap.get(ss[i]);
                smap.put(ss[i], sint++);
            }
        }
        
        
        for(int i=0;i<tt.length;i++){
            if(!tmap.containsKey(tt[i])){
                tmap.put(tt[i], 1);
            }else{
                tint=tmap.get(tt[i]);
                tmap.put(tt[i], tint++);
            }
        }
//below space to iterate and check if both hashmap values are sequentially 
    }

下面是我找到的解决方案,我打算使用这个逻辑,但我无法比较两个哈希图,因为两者都有不同的键...... 这里两个哈希映射中的所有键都不同,并且值序列可能相同,这就是我想检查的......如果所有值都按顺序相同或相等。

for (Map.Entry<String, Object> entry : map.entrySet()) {
     String key = entry.getKey();
     Object value = entry.getValue();
     // ... 
}
java hashmap
1个回答
0
投票

我将解决您提出的问题:如何计算两个

HashMap
对象的内容。这可能会也可能不会解决验证两个
String
对象同构的问题。

在回答这个问题之前,我想先偏离主题两次。

首先介绍一个可以辅助你测试调试的方法:

    public static <K,V> String mapToString (Map<K,V> map) {
        StringBuilder out = new StringBuilder ();
        out.append('[');
        Set<Map.Entry<K,V>> set = map.entrySet();
        for (Map.Entry<K,V> entry : set) {
            out.append (entry.getKey()).append (':')
               .append (entry.getValue()).append (',');
        }
        if (out.length() == 1) { 
            out.append (']');
        } else {
            out.setCharAt(out.length()-1, ']');
        }        
        return out.toString ();
    }

接下来,我想扩展我的评论:不要重复自己。在您问题中显示的代码中,您有两个部分加载

Map
,每个
String
参数一个部分。您可以将其简化为一个方法,然后调用它两次。这是与您的代码类似的代码,但作为一种方法:

public static LinkedHashMap<Character, Integer> loadMap (String str) {
        LinkedHashMap <Character, Integer> map = new LinkedHashMap <> ();
        char ss;
        int count = 0;
        for(int i=0;i<str.length();i++){
            ss = Character.toLowerCase(str.charAt(i));
            if(!map.containsKey(ss)){
                map.put(ss, 1);
            }else{
                count=map.get(ss);
                map.put(ss, count++);
            }
        }     
        System.out.println (mapToString (map));
        return map;
    }
  • 此代码使用
    HashMap<Character, Integer>
    而不是
    HashMap<String, Integer>
  • 此代码将大写字符转换为小写字符。然而,如果我正确理解了 LeetCode 205 的说明,这可能是不可取的
  • 我没有充分的理由使用
    Character
    而不是
    String
    作为键,也没有充分的理由使用
    charAt (int index)
    String
    方法而不是数组。这是我的偏好。
  • 顺便说一句,
    String
    API
    提供了
    toCharArray()
    方法。
  • 该代码包含一个错误。该错误位于原始问题的代码中,我在创建此方法时保留了它。我鼓励您找到并修复该错误。
  • 请注意,一旦在原始代码中发现错误,您将必须修复它两次。使用此方法,并调用它两次,您将必须修复它一次。这是“Don't Repeat Yourself”的优点之一。

现在,解决这个问题:

您可以使用

LinkedHashMap
。链接哈希映射是也具有双向链表的映射。链表按插入顺序维护条目。

虽然您想要迭代

Map
对象的内容,但
LinkedHashMap
API 不提供
get(int index)
或其他支持使用
for
循环进行迭代的方法。它也不直接提供
iterator
方法。

但是,它确实提供了这些方法:

  • public Set<Map.Entry<K,​V>> entrySet()
  • public Set<K> keySet()
  • public Collection<V> values()

请注意,

Set
Collection
的一种类型。还有一个
Collection
Iterable

  • 这些方法返回
    Collection
    LinkedHashMap
    视图。
  • 它们不会将数据从
    Map
    复制到
    new Set
    new Collection
    对象。
  • 它们允许您将
    Map
    视为
    Set
    Collection
  • 将它们视为您的
    Map
    对象的包装。

既然您知道这些方法的存在,并且可以找到 API 文档,那么您想如何使用它们就取决于您了。这是一种方法,但它与使用

Map<Character, Integer>
:

一致
public static boolean isIsomorphic(String s, String t) {      
        if (s.length() != t.length()) { return false; }
        LinkedHashMap <Character, Integer> smap = loadMap (s);
        LinkedHashMap <Character, Integer> tmap = loadMap (t);
        if (smap.size() != tmap.size()) { return false; }      
        Collection<Integer> tValues = tmap.values();
        Collection<Integer> sValues = smap.values ();
        List<Integer> tList = new ArrayList<> ();
        tList.addAll(tValues);
        List<Integer> sList = new ArrayList<> ();
        sList.addAll (sValues);
        return sList.equals(tList);
    }

注意: 我仅解决了顺序比较一对

HashMaps
的内容的问题。如果我对同构字符串问题的理解是正确的,则此代码将产生误报。也就是说,当一对
Strings
不严格同构时,它可以将它们识别为同构。我将让您找出原因,找到误报的示例。

© www.soinside.com 2019 - 2024. All rights reserved.