JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで配列内の非負数の連続グループ(クラスター)を数える方法

JavaScriptで配列を扱う際、負の数と非負の数(0以上の値)が混在したデータの中から、「非負の数が連続しているブロック」の数を数えたい場面があります。本記事では、そのような処理を簡潔に実装する方法を解説します。

問題の概要

たとえば、次のような数値の配列があるとします。

const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];

この配列の中から、0以上の数値が連続して並んでいるグループ(クラスター)を数える関数を作成します。

上記の配列の場合を見てみましょう。

  • インデックス3の「0」:単独ですが、これも1つのクラスターとしてカウントされます。
  • インデックス9から配列末尾までの「0, 1, 0」:これが2つ目のクラスターです。

したがって、この配列に対する関数の戻り値は 2 となります。

実装コード

以下は、reduce() メソッドを活用したシンプルな実装例です。

const arr = [-1,-2,-1,0,-1,-2,-1,-2,-1,0,1,0];
const positiveClusters = arr => {
    return arr.reduce((acc, val, ind) => {
        if(val >= 0 && (arr[ind+1] < 0 || typeof arr[ind+1] === 'undefined')){
            acc++;
        };
        return acc;
    }, 0);
};
console.log(positiveClusters(arr));

コードの仕組み

このロジックのポイントは、各要素について次の2つの条件を同時にチェックしている点です。

  1. 現在の要素が0以上であることval >= 0
  2. 次の要素が負の数、または存在しない(配列の末尾)であること

この両方を満たすとき、その位置は「1つのクラスターの終わり」にあたるため、カウンターを1つ増やします。初期値0からスタートし、クラスターの終端を検出するたびに加算することで、最終的なグループ数が得られます。

出力結果

このコードを実行すると、コンソールに以下の出力が表示されます。

2

まとめ

reduce() を使えば、ループを明示的に書かずとも、隣接する要素との比較を行いながらクラスター数を効率的に集計できます。条件判定の部分を変更すれば、「正の数のみ」「偶数のみ」といった別のパターンのグループ化にも応用できるので、ぜひ活用してみてください。

  1. JavaScriptで各要素より右側にある小さい数字の個数を数える方法

    問題概要今回は、数値の配列を唯一の引数として受け取るJavaScript関数を作成します。この関数は、入力された配列をもとに新しい配列を生成します。新しく作られる配列の各要素には、元の配列内で「対応する要素より右側に位置し、かつその値より小さい要素」の個数が格納されます。たとえば、次のような配列を入力したとします。const arr = [4, 7, 1, 4, 7, 5, 3, 8, 9];この場合、期待される出力は以下の通りです。const output = [2, 4, 0, 1, 2, 1, 0, 0, 0];出力結果の解説先頭の「4」よりも右側にあり、値がそれより小さい要素は「1」と

  2. JavaScriptで数値を反転する方法|負の数の符号を保持しながら桁を逆順にする

    課題今回は、数値を引数として受け取り、その桁を逆順に並べ替えた数値を返すJavaScript関数を作成します。実装時に注意すべき重要なポイントがあります。それは元の数値の符号を保持することです。つまり、負の数を反転させた場合でも、結果は必ず負の数のまま返されなければなりません。コード例以下がその実装コードです。 0) { y = y * 10 + (x % 10); x = Math.floor(x / 10); } return Math.sign(n) * y; } console.log(reverseNumber(num));出力結果-