需要帮助使字符串输入 return 成为计算字母对频率的直方图
Need help making string input return a histogram that counts frequency of letter pairs
我需要编写一个函数,将字符串作为输入并按降序输出字母对出现频率的直方图。
我已经设法编写了一个 returns 单个字符计数的函数,但我不知道如何进行双字符计数。
这是我目前所拥有的:
var string = "etc";
var histogram = {};
for (var i = 0, len = string.length; i < len; i++) {
var char = string[i];
if ((string[i] !== " ") && (string[i] !== " ")) {
histogram[char] = (histogram[char] || 0) + 1;
}
};
console.log(histogram);
该函数有效,我能够让它在直方图中保留所有空白区域。不过,我不知道从哪里开始。如何让它评估对,以及如何省略任何单个字符(那些后面没有跟另一个字符的字符)...非常感谢任何帮助。
您需要使用 string[i+1]
来获取对中的下一个字母。
并且为了避免在使用string[i+1]
时访问数组外,循环的限制应该是string.length-1
.
var string = "this is a good thing";
var histogram = {};
for (var i = 0, len = string.length - 1; i < len; i++) {
if ((string[i] !== " ") && (string[i + 1] !== " ")) {
let pair = string.substr(i, 2);
histogram[pair] = (histogram[pair] || 0) + 1;
}
};
console.log(histogram);
另一种方法,将问题分解成小块:
const inPairs = (xs) =>
[...xs].reduce((a, x, i) => i == 0 ? a : [...a, xs[i - 1] + x], [])
const pairFreq = str => str // "this is a good thing"
.split (/\s+/) //=> ["this","is","a","good","thing"]
.filter (s => s.length > 1) //=> ["this","is","good","thing"]
.flatMap (inPairs) //=> ["th","hi","is","is","go","oo","od","th","hi","in","ng"]
.reduce ( (a, s) => ({...a, [s]: (a[s] || 0) + 1}), {})
//=> {"th":2,"hi":2,"is":2,"go":1,"oo":1,"od":1,"in":1,"ng":1}
console .log (
pairFreq('this is a good thing')
)
显然,如果您愿意,可以内联 inPairs
。我喜欢这种转变方式,只需将让我朝着最终目标前进的步骤串联起来。
我需要编写一个函数,将字符串作为输入并按降序输出字母对出现频率的直方图。
我已经设法编写了一个 returns 单个字符计数的函数,但我不知道如何进行双字符计数。
这是我目前所拥有的:
var string = "etc";
var histogram = {};
for (var i = 0, len = string.length; i < len; i++) {
var char = string[i];
if ((string[i] !== " ") && (string[i] !== " ")) {
histogram[char] = (histogram[char] || 0) + 1;
}
};
console.log(histogram);
该函数有效,我能够让它在直方图中保留所有空白区域。不过,我不知道从哪里开始。如何让它评估对,以及如何省略任何单个字符(那些后面没有跟另一个字符的字符)...非常感谢任何帮助。
您需要使用 string[i+1]
来获取对中的下一个字母。
并且为了避免在使用string[i+1]
时访问数组外,循环的限制应该是string.length-1
.
var string = "this is a good thing";
var histogram = {};
for (var i = 0, len = string.length - 1; i < len; i++) {
if ((string[i] !== " ") && (string[i + 1] !== " ")) {
let pair = string.substr(i, 2);
histogram[pair] = (histogram[pair] || 0) + 1;
}
};
console.log(histogram);
另一种方法,将问题分解成小块:
const inPairs = (xs) =>
[...xs].reduce((a, x, i) => i == 0 ? a : [...a, xs[i - 1] + x], [])
const pairFreq = str => str // "this is a good thing"
.split (/\s+/) //=> ["this","is","a","good","thing"]
.filter (s => s.length > 1) //=> ["this","is","good","thing"]
.flatMap (inPairs) //=> ["th","hi","is","is","go","oo","od","th","hi","in","ng"]
.reduce ( (a, s) => ({...a, [s]: (a[s] || 0) + 1}), {})
//=> {"th":2,"hi":2,"is":2,"go":1,"oo":1,"od":1,"in":1,"ng":1}
console .log (
pairFreq('this is a good thing')
)
显然,如果您愿意,可以内联 inPairs
。我喜欢这种转变方式,只需将让我朝着最终目标前进的步骤串联起来。