JS. Сортировка по количеству вхождения символов
Нужно рассчитать частоту вхождений каждого символа текста в единицах и в процентах от общего числа символов. Вывод скрипта необходимо отсортировать по частоте вхождения символов от самого частого к наименее часто встречающемуся в текста.
var str = "K;;KKLSLJOIWOIOIWUIYUERYUOOKJ,M,MCX,MXCMX,MXC,M)";
var counts = {};
var ch, index, len, count, sum;
var arr = {}
for (index = 0, len = str.length; index < len; ++index)
{
ch = str.charAt(index); // JavaScript метод charAt() возвращает символ по заданному индексу внутри строки.
count = counts[ch];
counts[ch] = count ? count + 1 : 1; // Условный оператор. Если этот символ уже встречался в этой строчке, то прибавляем единицу, если нет, то возвращем значение 1
}
for (ch in counts)
{
console.log(ch + " частота: " + counts[ch] + " в процентах: " + (counts[ch]/len)*100) + "%";
}
console.log("Всего символов: " + len);
Вот со сортировкой у меня проблемы. Буду очень благодарна за помощь.
Ответы (2 шт):
Автор решения: highpassion
→ Ссылка
Код на скорую руку, однако работает.
var str = "K;;KKLSLJOIWOIOIWUIYUERYUOOKJ,M,MCX,MXCMX,MXC,M)",
counts = {},
ch, index, len, count, sum,
arr = [],
result = [];
for (index = 0, len = str.length; index < len; ++index) {
ch = str.charAt(index); // JavaScript метод charAt() возвращает символ по заданному индексу внутри строки.
count = counts[ch];
counts[ch] = count ? count + 1 : 1; // Условный оператор. Если этот символ уже встречался в этой строчке, то прибавляем единицу, если нет, то возвращем значение 1
}
for (ch in counts) {
arr.push([ch, counts[ch]]);
console.log(ch + " частота: " + counts[ch] + " в процентах: " + (counts[ch]/len)*100) + "%";
}
arr.sort(function(a, b) {
return b[1] - a[1];
});
for(let elem of arr) {
for (let i = 0; i < elem[1]; i++){
result.push(elem[0]);
}
}
console.log("Всего символов: " + len);
console.log(result);
Автор решения: vsemozhebuty
→ Ссылка
Лучше воспользоваться итерацией по строке (цикл for...of): так и проще, и обеспечивается гарантия, что символы Юникода из суррогатных пар будут правильно обработаны (в вашем варианте стоит добавить в строку замысловатый иероглиф или эмодзи — и скрипт на них споткнётся):
const str = 'K;;KKLSLJOIWOIOIWUIYUERYUOOKJ,M,MCX,MXCMX,MXC,M)';
let length = 0;
const simpleStatistics = {};
for (const symbol of str) {
length++;
simpleStatistics[symbol] ??= 0;
simpleStatistics[symbol]++;
}
const statisticsWithPercents = Object.entries(simpleStatistics).map(
([symbol, count]) => ({ symbol, count, percent: count / length * 100 })
);
statisticsWithPercents.sort((a, b) => b.count - a.count);
console.log(`Всего символов: ${length}`);
console.log(statisticsWithPercents);