JavaScriptで配列が昇順・降順・未ソートのどれかを判定する方法
はじめに
JavaScriptでは、数値の配列を受け取り、その要素が昇順(増加順)、降順(減少順)、あるいは特定の順序なし(未ソート)のどれに該当するかを判定する関数を作成できます。
本記事では、そのような判定を行う関数の実装方法と、コードの動作原理について詳しく解説します。
求められる仕様
今回作成する関数は、以下の条件を満たす必要があります。
- 数値の配列を引数として受け取る
- 要素が増加傾向なら「ascending」を返す
- 要素が減少傾向なら「descending」を返す
- 順序に一貫性がない場合は「unsorted」を返す
- 配列の要素が1つ以下の場合は「not enough items」(要素が不足しています)というメッセージを返す
- すべての要素が等しい場合は「all items are equal」(すべての要素が等しい)というメッセージを返す
実装コード
以下が実際のコード例です。
const arr1 = [7, 2, 1, 3, 2, 1];
const arr2 = [1, 1, 2, 3, 7, 7];
const determineOrder = arr => {
if(arr.length < 2){
return 'not enough items';
};
let ascending = null;
let nextArr = arr.slice(1);
for(var i = 0; i < nextArr.length; i++) {
if(nextArr[i] === arr[i]){
continue;
}else if(ascending === null) {
ascending = nextArr[i] > arr[i];
}else if (ascending !== nextArr[i] > arr[i]){
return 'unsorted';
};
}
if(ascending === null){
return 'all items are equal';
};
return ascending ? 'ascending' : 'descending';
};
console.log(determineOrder(arr1));
console.log(determineOrder(arr2));
console.log(determineOrder([1, 1, 1, 1]));
console.log(determineOrder([7, 2, 2, 1]));コードの解説
このアルゴリズムのポイントを以下にまとめます。
- 要素数のチェック: 配列の長さが2未満の場合、順序を判定できないため「not enough items」を返します。
- 初期状態: 変数
ascendingをnullで初期化し、まだ並び順の方向が確定していない状態とします。 - 隣接要素の比較: 元の配列から先頭を除いた配列(
arr.slice(1))と元の配列を同じインデックスで比較することで、隣り合う2つの要素を効率よく調べられます。 - 等しい要素はスキップ: 隣接する2つの値が等しい場合、並び順の判定には影響しないため
continueでスキップします。 - 方向の確定: 初めて大小関係が見つかった時点で、それが増加か減少かを
ascendingに記録します。 - 矛盾の検出: 一度確定した方向と異なる大小関係が出現した場合は「unsorted」を返します。
- 最終判定: ループ終了後も
ascendingがnullのままなら全要素が等しいことになり、そうでなければ方向に応じた結果を返します。
実行結果
上記のコードをコンソールで実行すると、次のような出力が得られます。
unsorted ascending all items are equal descending
[7, 2, 1, 3, 2, 1]→ 増加と減少が混在しているため unsorted[1, 1, 2, 3, 7, 7]→ 減少せず増加のみのため ascending[1, 1, 1, 1]→ すべての要素が等しいため all items are equal[7, 2, 2, 1]→ 等しい要素を含みつつ減少傾向のため descending
まとめ
このように、隣接する要素同士を順番に比較しながら並び順の方向を追跡することで、配列が昇順・降順・未ソートのどれであるかを一度の走査で判定できます。等しい要素を柔軟に扱える点も実務的なコードになっています。ぜひ自分のプロジェクトでも活用してみてください。
-
C#で配列が読み取り専用(ReadOnly)かどうかを確認する方法
C#で配列が読み取り専用(Read-Only)かどうかを確認するには、IsReadOnly プロパティを使用します。このプロパティは、配列が読み取り専用であれば true、書き込み可能であれば false を返します。 あわせて覚えておきたいのが IsFixedSize プロパティです。通常の配列は常に固定サイズ(true)ですが、読み取り専用とは限りません。配列を読み取り専用にしたい場合は、Array.AsReadOnly メソッドを使ってラップする必要があります。 それでは、実際のコード例を見ていきましょう。 例1:空の配列の場合 using System; public class
-
Pythonでリストがソート済みかどうかを確認する2つの方法
Pythonにおいて、リストは最も広く使われているデータコレクションの一つです。開発の現場では、与えられたリストがすでに昇順にソートされているかどうかを確認したい場面によく出会います。この記事では、その判定を行うための代表的なアプローチを2つ、サンプルコード付きで紹介します。 方法1:sort()メソッドを使う まず元のリストのコピーを作成し、そのコピーに対してsort()メソッドを適用します。その後、ソート済みのコピーと元のリストを比較し、両者が完全に一致していれば「元のリストはすでにソートされている」と判断できます。 サンプルコード listA = [11,23,42,51,67] # 与