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

How to implement Java's HashMap.equals(HashMap) in JavaScript

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

这是我的 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);
  }

我正在尝试在 Java脚本中复制它:

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 代码 return 是正确的,这是正确的。但是,JS函数return false.

有没有办法 return 当两个映射具有相同的键和值但顺序不同时,它们在 JS 中是相等的?

您的代码的问题在于您比较两个地图对象的方式。在 Java 中你使用 equels 但如果你使用 == 你将得到相同的总是错误的结果。 在 js 中,您可以通过键循环比较两个对象,并比较每个键的存在和值,或者为了更短但开销很小,只需执行 JSON.stringify(aMap)===JSON.stringify(bMap) 而不是 aMap= =b地图

更新 正如您提到的 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)只需创建差异图。因此,来自字符串 A 的字符会将键添加到值为 1 的映射和/或递增计数器,而来自字符串 B 的字符会在 属性 值大于 1 时递减计数器或创建具有 -1 值的新值(如果值 = == 0 然后从对象中删除键 属性)。最后使用 Object.keys(obj).length === 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 方法对我有用。