JavaScriptでアナグラムの単語をグループ化する方法
アナグラムとは
同じ文字を別の順序に並べ替えることで互いに作り出せる2つの単語やフレーズは、互いの「アナグラム(Anagram)」と呼ばれます。たとえば、「rat」と「tar」はどちらも r・a・t の3文字で構成されているため、互いのアナグラムです。
本記事では、アナグラムの文字列を含む可能性がある文字列の配列を受け取り、すべてのアナグラムを個別のサブ配列にグループ化して、その新しい配列を返すJavaScript関数の実装方法を解説します。
期待される入出力
たとえば、入力配列が次の場合:
const arr = ['rat', 'jar', 'tar', 'raj', 'ram', 'arm', 'mar', 'art'];
出力配列は次のようになります:
const output = [
['rat', 'tar', 'art'],
['jar', 'raj'],
['ram', 'arm', 'mar']
];
実装コード
以下が実際のコードです:
const arr = ['rat', 'jar', 'tar', 'raj','ram', 'arm', 'mar', 'art'];
const groupSimilarWords = (arr = []) => {
if (arr.length === 0){
return arr;
};
const map = new Map();
for(let str of arr){
let sorted = [...str];
sorted.sort();
sorted = sorted.join('');
if(map.has(sorted)){
map.get(sorted).push(str);
}else{
map.set(sorted, [str])
};
};
return [...map.values()];
};
console.log(groupSimilarWords(arr));
アルゴリズムの解説
このアプローチのポイントは、各文字列を「文字をソートした結果」をキーとしてMapに登録することです。アナグラム同士は文字をソートすると必ず同一の文字列になるため、それをキーにすれば自然な形でグループ化できます。
- 入力配列が空の場合は、そのまま空の配列を返します。
- 各文字列に対して、スプレッド構文
[...str]で1文字ずつ分解し、sort()でソートした後、join('')で連結してキーを生成します。 - Mapにそのキーがすでに存在すれば既存の配列へ追加し、存在しなければ新しいエントリを作成します。
- 最後に
map.values()をスプレッド展開して、グループ化されたサブ配列の配列として返します。
出力結果
コンソールには以下のように出力されます:
[ [ 'rat', 'tar', 'art' ], [ 'jar', 'raj' ], [ 'ram', 'arm', 'mar' ] ]
-
JavaScriptにおける継承の基本を具体例で解説
JavaScriptは、クラスベースではなくプロトタイプベースのオブジェクト指向言語です。そのため、継承はprototype(プロトタイプ)オブジェクトを通じて実現されます。コンストラクタ関数のprototypeプロパティにメソッドやプロパティを追加すると、そのコンストラクタから生成されたすべてのインスタンスが、それらを共有して利用できるようになります。 プロトタイプによる継承の仕組み JavaScriptでは、インスタンスからプロパティやメソッドが参照されるとき、まずオブジェクト自身を検索し、見つからなければプロトタイプチェーンをたどって上位のオブジェクトへと探しに行きます。これにより、各イ
-
JavaScriptのグループ化演算子とは?優先順位の制御方法をサンプルコードで解説
グループ化演算子とはJavaScriptのグループ化演算子は、丸括弧「()」で表され、式を評価する際の優先順位を制御するために使用されます。通常、演算子にはあらかじめ決められた優先順位があり、乗算(*)や除算(/)は加算(+)や減算(-)よりも先に評価されます。しかし、グループ化演算子で式を囲むことで、この優先順位を意図的に変更し、囲まれた部分を最優先で計算させることができます。例えば「2+2*5/22」という式の場合、標準の優先順位では乗算・除算が先に実行されますが、丸括弧を使うことで「(2+2)*5/22」のように加算を先に行わせることが可能です。サンプルコード以下は、JavaScript