Сортировка массива по большинству вхождений определенных букв - PullRequest
0 голосов
/ 12 июня 2018

У меня есть array слов и следующий список букв:

searoiltnudcypmhgbkfwvzxjq

Я бы хотел отсортировать array по порядку буквв этом списке, так что слово с наибольшим количеством букв в начале списка появляется первым.Например: следующее:

var wordList = "nymph, races, tundra"; 

После сортировки должно быть:

wordList = "races, tundra, nymph"; 

Пока у меня есть следующее, чтобы назначить вес каждой букве в списке:

  for (let h = 0; h < freqWords.length; h++) {
     this["freq" + h] = h; 
  }

Далее я должен дать каждому слову в массиве значение, основанное на том, сколько из этих переменных он содержит, а затем отсортировать путь от минимального значения к наибольшему значению.К сожалению, я не знаю синтаксис для достижения этой цели.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Более короткая декларативная альтернатива в функциональном стиле:

const letters = 'searoiltnudcypmhgbkfwvzxjq';
const input = "nymph, races, tundra"
const sorted = input.split(',').map(str => str.trim()).sort((aWord, bWord) => {

    const aCount = aWord.split('').filter(char => letters.includes(char)).length;
    const bCount = bWord.split('').filter(char => letters.includes(char)).length;

    return bCount - aCount;

});
0 голосов
/ 12 июня 2018

Во-первых, будет намного проще, если вы преобразуете свой список букв в массив и если вы также преобразуете свой список слов в массив.Затем вам нужно написать функцию компаратора для Array.prototype.sort, которая подсчитывает количество букв, содержащихся в указанном массиве букв.Вот реализация, которая решает вашу проблему:

const letters = [
  's', 'e', 'a', 'r', 'o', 'i', 'l', 't', 'n', 
  'u', 'd', 'c', 'y', 'p', 'm', 'h', 'g', 'b', 
  'k', 'f', 'w', 'v', 'z', 'x', 'j', 'q'
];

const wordList = [
  'nymph', 
  'races', 
  'tundra'  
];

console.log(wordList);

const sortedList = wordList.sort((a, b) => {
  const aOccurences = letterOccurences(letters, a);
  const bOccurences = letterOccurences(letters, b);
  return aOccurences - bOccurences;
});

console.log(sortedList);

function letterOccurences(letters, word) {
  let occurences = 0;
  for (let i = 0; i < word.length; i++) {
    if (letters.includes(word.substring(i, i+1))) {
        occurences++;
    }
  }
  return occurences;
}

Список ввода: nymph, races, tundra

Результат: tundra, nymph, races (6, 5 и 5 вхождений соответственно.)

РЕДАКТИРОВАТЬ: Если вам нужно, чтобы я объяснил что-либо или если какой-либо синтаксис незнаком, сообщите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...