簡體   English   中英

Javascript獲取字符串中所有最常用的字符

[英]Javascript get all the most frequent characters in a string

我需要幫助,我如何能得到只是一個,但在一個字符串最常見的字符/字母。

我的代碼僅適用於獲取常見字符之一。

但是當多個字符同樣常見時,只返回一個。 如果兩個字符很常見,我希望它返回兩個字符。

const x = mostCommonCharacter("abbbcddefffg");
console.log(x); // result is *b* 

如果bf是最常見的,我想返回bf

  function mostCommonCharacter(str) {
  const charHolder = {}; // { a: 1, b: 3, c: 1, d: 2, e: 1, f: 3, g: 1 }

  str
    .toLowerCase()
    .split("")
    .forEach(char => {
      if (char != " ") {
        if (charHolder[char] == null) {
          charHolder[char] = 1;
        } else {
          charHolder[char] += 1;
        }
      }
    });
  let highest_num = 0;
  let letter = "";
  for (const key in charHolder) {
    if (charHolder[key] > highest_num) {
      highest_num = charHolder[key];
      letter = key;
    }
  }
  return letter;
}

但它只返回一個最常見的字符“ b

我需要的是它返回“ b ”和“ f ”,因為它們都是最常見的。 而不僅僅是b有沒有辦法做到這一點?

獲取highest_num ,然后再次遍歷對象並獲取count等於highest_num那些字母

 function mostCommonCharacter(str) { const charHolder = {}; // { a: 1, b: 3, c: 1, d: 2, e: 1, f: 3, g: 1 } str .toLowerCase() .split("") .forEach(char => { if (char != " ") { if (charHolder[char] == null) { charHolder[char] = 1; } else { charHolder[char] += 1; } } }); let highest_num = 0; for (const key in charHolder) { if (charHolder[key] > highest_num) { highest_num = charHolder[key]; } } let res = ''; for(let k in charHolder){ if(charHolder[k] === highest_num){ res += k; } } return res; } console.log(mostCommonCharacter("abbbcddefffg"))

可以通過使用reduce()Math.max獲得更短的代碼版本

 function mostCommonCharacter(str) { const charHolder = str .toLowerCase() .split('') .reduce((ac,a) => (ac[a] = ac[a] + 1 || 1, ac), {}); let max = Math.max(...Object.values(charHolder)); return Object.entries(charHolder).reduce((ac,[k,v]) =>v === max ? ac + k : ac, ''); } console.log(mostCommonCharacter("abbbcddefffg"))

您可以通過簡單的更改來完成此操作。 如果它等於“highest_num”,只需將字母添加到“letters”。

  let highest_num = 0;
  let letters = "";
  for (const key in charHolder) {
    if (charHolder[key] > highest_num) {
      highest_num = charHolder[key];
      letters = key;
    } else if (charHolder[key] === highest_num) {
      letters += key;
    }
  }

請找到一種更緊湊的方法,您可以使用Array.prototype.reduce在將字符串拆分為數組后從字符串中獲取對象中的 {letter: frequency} 映射。

然后使用Object.entries對 [key, values] 的條目進行排序后得到最頻繁和第二頻繁的字母:

 const x = mostCommonCharacter("abbbcddefffg"); function mostCommonCharacter(str){ const dict = str.split("").reduce((acc, ele) =>{ acc[ele] = (acc[ele] || 0) + 1; return acc; }, {}); const letters = Object.entries(dict).sort((a, b) => b[1] - a[1]).map(a => a[0]); return letters.length > 1 ? letters.slice(0, 2).join("") : letters.length > 0 ? letters[0] : null; } console.log(x);

一種涉及使用hashmaps的算法方法的解決方案。

 var a = 'abbbcddefffg'; const counter = (str) => { var ch = {}; for(var i=0; i<str.length;i++) { if(str[i] in ch) { ch[str[i]] += 1 } else { ch[str[i]] = 1 } } return ch; } let sorted = (list) => Object.fromEntries(Object.entries(list).sort( (a,b) => b[1] - a[1] )) let counterInSorted = sorted(counter(a)); let getXMostOccuring = (stringObj, x) => { return Object.keys(stringObj).slice(0,x).join(''); } console.log('First x elements occuring frequently'); console.log(getXMostOccuring(counterInSorted,2)); console.log(sorted(counter(a)))

這種方法將以排序的方式提供每個字符的頻率。 您現在可以決定獲取 'x' 個最常出現的字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM