如何在JavaScript中实现Java的HashMap.equals(HashMap)

时间:2018-06-27 12:58:48

标签: javascript hashmap keyvaluepair

我正在尝试编写一个接受两个字符串并返回它们是否具有相同频率的字母的函数。假定两个字符串都不为空。

这是我的Java实现:

  public void addToMap(HashMap<String, Integer> map, String s){
  if(map.get(s) == null){
    map.put(s, 1);
  } else{
    map.put(s, map.get(s)+1);
  }
}

  public boolean perm(String a, String b){
    if(a.length() != b.length()){
      return false;
    }
    HashMap<String, Integer> aMap = new HashMap<>();
    HashMap<String, Integer> bMap = new HashMap<>();
    for(int i = 0; i < a.length(); i++){
      addToMap(aMap, a.substring(i,i+1));
      addToMap(bMap, b.substring(i,i+1));
    }
    return aMap.equals(bMap);
  }

我正在尝试在JavaScript中复制它:

const addToMap = (map, s) => {
  if(map[s] == null){
    map[s] = 1;
  } else{
    map[s] = map[s]+1;
  }
}

const perm = (a,b) => {
  if(a.length != b.length){
    return false;
  }
  let aMap = new Map();
  let bMap = new Map();
  for(let i = 0; i < a.length; i++){
    addToMap(aMap, a.substring(i,i+1));
    addToMap(bMap, b.substring(i,i+1));
  }
  return aMap === bMap;
}

我对两种实现都测试了perm(“ abca”,“ bcaa”)。 Java代码返回true,这是正确的。但是,JS函数返回false。

当键和值相同但顺序不同时,是否有办法返回两个映射在JS中相等?

2 个答案:

答案 0 :(得分:0)

代码的问题是如何比较两个地图对象。在Java中,您使用等号,但如果使用==,则始终会得到相同的错误结果。 在js中,您可以通过键循环比较两个对象,并比较每个键的存在和值,或者比较短的键和键值,但开销很小,只需JSON.stringify(aMap)=== JSON.stringify(bMap)而不是aMap == bMap

更新 正如您提到的JSON.stringify不起作用。 (通常,当您遍历键时,它们将按字母顺序排列,但这是浏览器相关的功能,因为js中的对象通常不是有序的键值属性)。

因此,当我提到您时,您只需要比较两个地图即可。例如:

const isSubMap = function(mapA, mapB) {
  for (let key in mapA) {
    if (!mapB[key] || mapA[key] !== mapB[key]) {
      return false;
    }
  }
  return true;
}

但是对于我来说,我会采用不同的方法来解决这个问题: 1)将来自字符串A和字符串B的所有字符的字符代码求和,然后比较sumA == sumB; 2)只需创建差异图即可。因此,如果属性值大于1或创建新的-1值(如果value === 0,则来自字符串A的字符会将键值1和/或递增计数器添加到映射,而来自字符串B的chars将递减计数器的值。从对象中删除键属性)。最后,使用Object.keys(obj).length === 0;

检查对象是否具有零属性。

答案 1 :(得分:0)

这是我创建的有效代码:

const addToMap = (map, s) => {
  if(map.has(s)){
    map.set(s, map.get(s)+1);
  } else{ map.set(s, 1);}
}

const perm = (a, b) => {
  if(a.length != b.length){ return false; }
  let aMap = new Map();
  let bMap = new Map();
  for(let i = 0; i < a.length; i++){
    addToMap(aMap, a.substring(i, i+1));
    addToMap(bMap, b.substring(i, i+1));
  }
  return aMap.toString() == bMap.toString();
}
const s1 = "abcda";
const s2 = "cdbaa";
console.log(perm(s1, s1));

发生的事情是我对Map()使用了错误的语法。我当时使用括号表示法来创建键值对或Map.prototype方法。

请参阅以下代码示例:

let m = new Map();
m.set(1, "a");
m[2] = "b";
console.log(m);
//Output: Map { 1 => 'a', 2: 'b' }

使用Map.get和Map.set方法对我有用。