Как реализовать Java HashMap.equals (HashMap) в JavaScript

Я пытаюсь написать функцию, которая принимает две строки и возвращает, имеют ли они одинаковую частоту букв. Предполагается, что ни одна строка не является пустой.

Вот моя реализация на 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 возвращает истину, что верно. Однако функции JS возвращают false.

Есть ли способ вернуть, что две карты равны в JS, если у них одинаковые ключи и значения, но в другом порядке?

Если ваш код работает, подумайте об этом в Проверка кода

soufrk 27.06.2018 15:03

Проблема в том, как вы объединяете оба объекта Map() в Javascript. Я настоятельно рекомендую вам проверить этот stackoverflow.com/questions/35948335/…

Ivan Kaloyanov 27.06.2018 15:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
440
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема с вашим кодом заключается в том, как вы сравниваете два объекта карты. В Java вы используете equels, но если вы используете ==, вы всегда получите такой же ложный результат. В 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) Просто создайте карту различий. Таким образом, символы из строки A добавят ключ к карте со значением 1 и / или увеличат счетчик, а символы из строки B будут уменьшать счетчик, если значение свойства больше 1, или создать новый со значением -1 (если значение === 0, то удалить ключевое свойство из объекта). В конце проверьте, имеет ли объект нулевые свойства с помощью Object.keys (obj) .length === 0;

Он по-прежнему возвращает false. Это не удается: console.info (perm ("abca", "bcaa")); Сравнивались строки: Карта {a: 2, b: 1, c: 1} Карта {b: 1, c: 1, a: 2} Я не понимаю, почему они пройдут.

God Complex 29.06.2018 02:30

Однако это работает, добавление этого в мой код заставит меня пройти всю строку и карту, чего я бы предпочел не делать. Я нашел решение вопроса о перестановке: stackoverflow.com/questions/35948335/… Объект Map в JS просто не сравнивается. stackoverflow.com/q/37049306/7066218 Но для моей проблемы с картой JS кажется, что

God Complex 04.07.2018 14:49
Ответ принят как подходящий

Вот созданный мной код, который работает:

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.info(perm(s1, s1));

Произошло то, что я использовал неправильный синтаксис для Map (). Я использовал скобки для создания пар ключей и значений вместо методов Map.prototype.

См. Этот пример кода:

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

Мне подходят методы Map.get и Map.set.

Другие вопросы по теме