Частота символов - сортировка элементов в алфавитном порядке после их сортировки по частоте - PullRequest
0 голосов
/ 08 октября 2019

Ссылка на вызов Codewars

Мне удалось создать карту частот для счетчика букв в строке:

function letterFrequency(text){
    text = text.toLowerCase();
    let map = {};
    let array = text.split('');
    array.forEach((value, index) => {
      if (!map[value]) {
        map[value] = 0;
      }
      map[value] += 1;
    });
    return Object.entries(map).filter((el) => el[0] !== ' ')
    //sorts array according to count
    .sort((a, b) => b[1] - a[1]);
    //how to sort alphabetically when letters have same count?
}
console.log(letterFrequency('aaAabb dddDD hhcc'));

Но я не смог понять, как сортировать по алфавиту, когда счетчики частоты одинаковы.

Т.е.

[['d',5], ['a',4], ['b',2], ['h',2], ['c',2]]

Вместо этого должно быть:

[['d',5], ['a',4], ['b',2], ['c',2], ['h',2]]

Как я могу вести подсчет частоты как основной приоритет сортировки, но затем также сортировать по алфавиту после сортировки по частоте?

Также попытка этого, к сожалению, не имела никакого эффекта:

function letterFrequency(text){
    text = text.toLowerCase();
    let map = {};
    let array = text.split('');
    array.forEach((value, index) => {
      if (!map[value]) {
        map[value] = 0;
      }
      map[value] += 1;
    });
    return Object.entries(map).filter((el) => el[0] !== ' ')
    .sort((a, b) => b[1] - a[1])
    .sort((a, b) => a[0] - b[0]);
}

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Вы можете "или" (||) разница подсчета с результатом localeCompare, так что если разница подсчета составляет 0, localeCompare имеет приоритет:

function letterFrequency(text) {
  text = text.toLowerCase();
  let map = {};
  let array = text.split('');
  array.forEach((value, index) => {
    if (!map[value]) {
      map[value] = 0;
    }
    map[value] += 1;
  });
  return Object.entries(map).filter((el) => el[0] !== ' ')
    .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
}

console.log(letterFrequency('dadbahddbccdh'));
1 голос
/ 08 октября 2019

вы можете сделать два вида. сортировка по алфавиту, затем по номеру, таким образом, алфавитный порядок сохраняется при выполнении числовой сортировки после

var x = [['d',5], ['a',4], ['b',2], ['h',2], ['c',2]];
x.sort(function(a, b){
    if(a[0] < b[0]) { return -1; }
    if(a[0] > b[0]) { return 1; }
    return 0;
}).sort(function(a, b){
    return b[1] - a[1]})
...