如何在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 方法对我有用。
我正在尝试编写一个函数,它接受两个字符串和 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 方法对我有用。