サンプルコード
AtCoder的な問題を解いている際に覚えた「every」「Set」の使い方について、かんたんに記事にまとめてみました。
今回取り上げるコードは、ユーザーが入力した配列 a に対して以下を判定しています。
-
aの全要素が 1以上100以下 - 要素に重複がない
これらの判定を行う中で、特に便利なのが Array.prototype.every と Set です。
以下は、everyとSetの使い方についてなるべく短縮したサンプルコードです。
// ユーザーの入力を受け取る処理
let a = require('fs').readFileSync('/dev/stdin','utf8').split(' ').map(Number);
// everyとSetを使って要素を評価。結果がtrueなら要素全体を出力、falseならerrorを出す
console.log(a.every(x=>x>=1&&x<=100) && new Set(a).size===a.length ? a : 'error');
1. everyメソッドで配列の要素を評価
ここからは各要素について解説していきます。
every は「配列のすべての要素が条件を満たすか」を判定します。
このコードでは以下のように使われています。
a.every(x => x >= 1 && x <= 100)
aはユーザーが入力した配列で、every(x =>では配列内の要素について条件に当てはまるかを判定しています。
xはただの変数名のため、基本なんでも大丈夫です。適当に設定しましょう。
上記の例で行っていることは
- 各要素
xを順番に評価 -
xが1以上かつ100以下ならtrue - すべての要素が
trueなら最終的にtrueを返す
every の特徴は、ひとつでも条件を満たさない要素があれば即座に false を返す点です。これにより無駄なループ処理を省けます。
2. Setで配列の重複判定をシンプルに
Set は重複のない値のコレクションです。配列から Set を作ると、重複要素は自動的に除去されます。
このコードでは以下のように書かれています。
new Set(a).size === a.length
ここで比較しているのは:
-
new Set(a).sizeとは重複を除いた要素数 -
a.lengthとは元の配列の要素数
両者が等しければ「重複なし」、異なれば「重複あり」 となります。
今回の例では、ユーザーが以下のような入力をすれば最終的にtrueとなります。
1 2 3 4 5
>>>true
出力 : [ 1, 2, 3, 4, 5 ]
逆にfalseの場合は、
1 2 3 4 4
>>>false
出力 : error
おまけ : 「?」を使った条件式について
最終的に、このコードは以下のような三項演算子を使って条件をまとめています。
(条件1 && 条件2) ? a : 'error'
この 「?」 とは、条件式がtrueかfalseかを判定し、条件がすべてtrueならaを出力し、何か1つでもfalseならerrorを出力します。
三項演算子を用いることで、if文を使わず短く書くことができます。