如何实现Java';JavaScript中的s HashMap.equals(HashMap)

如何实现Java';JavaScript中的s HashMap.equals(HashMap),javascript,hashmap,keyvaluepair,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(Stri

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

以下是我的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);
  }
public void addToMap(HashMap映射,字符串s){
if(map.get=null){
地图.put(s,1);;
}否则{
map.put(s,map.get(s)+1;
}
}
公共布尔perm(字符串a、字符串b){
如果(a.长度()!=b.长度()){
返回false;
}
HashMap aMap=新的HashMap();
HashMap bMap=新的HashMap();
对于(int i=0;i
我试图在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;
}
const addToMap=(映射,s)=>{
如果(映射=null){
map[s]=1;
}否则{
map[s]=map[s]+1;
}
}
常数perm=(a,b)=>{
如果(a.长度!=b.长度){
返回false;
}
设aMap=newmap();
设bMap=newmap();
for(设i=0;i
我测试了这两种实现的perm(“abca”、“bcaa”)。Java代码返回true,这是正确的。但是,JS函数返回false


当两个贴图具有相同的键和值,但顺序不同时,是否有方法返回两个贴图在JS中相等?

代码的问题在于如何比较两个贴图对象。在Java中,您使用equals,但如果使用==您将得到相同的始终为false的结果。 在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中所有字符的charcodes求和,然后比较sumA==sumB;
2) 只需创建一个差异地图。因此,字符串A中的字符将使用值1和/或递增计数器向映射添加键,如果属性值大于1,字符串B中的字符将递减计数器,或者使用-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));

使用Mava.GET和MAP.SET方法为我工作。

如果你的代码工作,在这个问题上考虑这个问题是你在JavaScript中同时使用<代码>(MeP)> /Cord>对象的方式。我强烈建议你检查这个,它仍然返回false。此操作失败:console.log(perm(“abca”、“bcaa”);比较的字符串:Map{a:2,b:1,c:1}Map{b:1,c:1,a:2}我不明白为什么这些会通过。这确实有效,但是,将其添加到代码中会迫使我遍历整个字符串和映射,我不希望这样做。我找到了排列问题的解决方案:JS中的Map对象就是不比较。但对于我的JS地图问题,似乎
let m = new Map();
m.set(1, "a");
m[2] = "b";
console.log(m);
//Output: Map { 1 => 'a', 2: 'b' }