js
1const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"];
上の場合は配列内で最も多い「e」が出力されるようにしたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/11 09:07
2020/01/11 10:33
回答5件
0
ループ回数をN回にして、最速で求めたい。
出現回数最大の要素が複数存在するかもしれないので、new Set
で返したい。
JavaScript
1'use strict'; 2const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d", "f", "f", "f"]; 3const s = (a,i,v) => (a[i]?a[i].add(v):a[i]=new Set(v),i); 4const c = array.reduce(function (a,v) {return (this.set(v, s(a,(this.get(v)+1||1),v)),a);}.bind(new Map), []).pop(); 5 6console.log([...c]); // ["e", "f"]
(※真の最速は while
一択ですが…)
Re: sbhduriopk さん
投稿2020/01/11 10:37
総合スコア18189
0
大喜利ですね?
JavaScript
1const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"]; 2console.log([...array.sort().join("").matchAll(/(.)\1+/g)].map(a => a[0]).sort((a, b) => b.length - a.length)[0][0]);
投稿2020/01/11 13:42
編集2020/01/11 14:01総合スコア28669
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
回答するにあたって、
- 「配列から最頻出の要素を見つけ出す」という汎用的なコードは、既にどこかで作られていると思われるので、これをいかにして自作しないで済ませられるか?
という方針で考えました。ご質問の本題は、統計用語の最頻値(モード) を求めることですので、何らかの統計ライブラリを使えば良さそうです。探してみると、 jStat のメソッド mode() が見つかります。これを使って、一文字の文字列を要素とする配列 charAry
を受け取り、最頻出の要素の配列を返す関数
modeOfChars(charAry)
を作成しました。
javascript
1const modeOfChars = (charAry = []) => { 2 if (!charAry.length) return []; 3 4 const intAry = charAry.map(ch => ch.charCodeAt(0)); 5 const mode = jStat.mode(intAry); 6 7 return mode.length ? mode.map(String.fromCharCode) : [String.fromCharCode(mode)]; 8} 9 10 11// 以下、実行例 12console.log(modeOfChars(["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"])); // => ["e"] 13console.log(modeOfChars(["a", "b", "c", "d", "e", "e", "b", "e", "c", "b", "d"])); // => ["b", "e"] 14console.log(modeOfChars([])); // => [] 15console.log(modeOfChars()); // => []
- 動作確認用CodePen: https://codepen.io/jun68ykt/pen/eYmrMXW?editors=0012
jStatを使うために、所与の文字列の配列を数値の配列に変換する必要がありますので、上記の modeOfChars(charAry)
では、所与の配列charAry
の要素がアルファベット一文字であることを前提として、各文字のASCIIコードの配列intAry
を得て、それに対してモードを取得し、再度、一文字の文字列に戻しています。
投稿2020/01/11 12:54
編集2020/01/11 18:28総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
好きに使って下さい。考え方次第ではこんな無駄な恥ずかしいコードでも動きます。
あなたがやっていることは考えることすらしてないように見えます。自分のソースを出しましょう。
※出現頻度を調べたい対象が非数字、かつ一文字だから動くしょぼい実装です。
js
1function RunLength(str) { 2 var output = ''; 3 while (str.length > 0) { 4 var current = new RegExp(str[0] + '+'); 5 var length = str.match(current).toString().split('').length; 6 output += length.toString() + str.match(current)[0][0] + ","; 7 str = str.replace(str.match(current)[0], ''); 8 } 9 10 return output; 11} 12 13function compare(a, b) { 14 a = Number( a.match(/\d*/)[0]); 15 b = Number( b.match(/\d*/)[0]); 16 if (a < b) { 17 return 1; 18 } 19 if (a > b) { 20 return -1; 21 } 22 return 0; 23} 24 25//const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"]; 26const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"]; 27 28 29console.log(RunLength(array.sort().join("")).split(/,/).sort(compare)[0].match(/\d*/)[0]); 30
投稿2020/01/11 10:36
編集2020/01/11 12:02総合スコア2826
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Ramda を使って実装したい。
JavaScript
1import {countBy, head, identity, last, maxBy, reduce, toPairs} from "//cdn.jsdelivr.net/npm/ramda@0.26.1/es/index.js"; 2const manyEntry = (arr) => head(reduce(maxBy(last))([undefined, 0])(toPairs(countBy(identity)(arr)))); 3const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"]; 4console.log(manyEntry(array));
投稿2020/01/11 09:43
編集2020/01/11 10:41総合スコア21737
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。