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

JavaScriptで文字列がソート済みかどうかを判定する方法

本記事では、引数として受け取った文字列がソート済み(昇順または降順に整列された状態)であるかどうかを判定するJavaScript関数の実装方法を解説します。

期待する動作

作成する関数は、以下のように動作します。

isSorted('adefgjmxz'); // true(アルファベット順=昇順)
isSorted('zxmfdba');   // true(逆アルファベット順=降順)
isSorted('dsfdsfva');  // false(昇順と降順が混在)

判定の考え方

文字列内の隣り合う2文字を取り出し、charCodeAt()で取得した文字コードを比較します。その差分が正であれば「昇順」、負であれば「降順」と記録していき、昇順と降順が両方検出された場合にのみfalseを返します。すべての隣接ペアが同じ向きであれば、文字列は整列されていると判断できます。

サンプルコード

const isStringSorted = (str = '') => {
  // 長さが2未満の文字列は常にソート済みとみなす
  if (str.length < 2) {
    return true;
  }

  let hasAsc = false;  // 昇順の隣接ペアが存在するか
  let hasDesc = false; // 降順の隣接ペアが存在するか

  for (let i = 0; i < str.length - 1; i++) {
    const diff = str.charCodeAt(i + 1) - str.charCodeAt(i);

    if (diff > 0) {
      hasAsc = true;
    } else if (diff < 0) {
      hasDesc = true;
    }

    // 昇順と降順が混在していればソートされていない
    if (hasAsc && hasDesc) {
      return false;
    }
  }

  return true;
};

// 動作確認
console.log(isStringSorted('adefgjmxz')); // true
console.log(isStringSorted('zxmfdba'));   // true
console.log(isStringSorted('dsfdsfva'));  // false

コードのポイント

  • 早期リターン:長さ2未満の文字列には順序の崩れが存在しないため、即座にtrueを返します。
  • charCodeAt()による比較:文字をUnicodeコードポイントの数値に変換することで、大小関係をシンプルに判定できます。
  • フラグ管理:昇順・降順のどちらか一方のみであれば整列済みとし、両方出現した時点ですぐにfalseを返すことで、無駄なループ処理を回避しています。

実行結果

コンソールには次のように出力されます。

true
true
false

この手法を用いれば、O(n)の線形時間で文字列が整列されているかどうかを効率的に判定できます。等しい文字が連続する場合も順序違反とはみなさないため、実務上のさまざまなバリデーション処理にも応用可能です。

  1. JavaScriptで文字列を真偽値(Boolean)に変換する方法

    JavaScriptでは、文字列が「true」というリテラルと一致するかどうかを比較演算子で判定することで、文字列を実質的に真偽値(Boolean)として扱うことができます。ここでは、==(緩い等価比較)と===(厳密等価比較)の2つの方法を使った具体例を紹介します。 サンプルコード <!DOCTYPE html> <html> <head> <style>     body {         font-family: &

  2. 【JavaScript】ユーザーが入力した文字列が配列に含まれているかチェックする方法

    本記事では、ユーザーに文字列を入力してもらうための入力欄を備えたJavaScriptプログラムを作成します。 プログラムは、入力された値が、あらかじめコード内で定義しておいた配列の要素と一致するかどうかを判定します。入力された文字列が配列内に存在すれば画面に「true」を、存在しなければ「false」を表示します。 実装例 この動作を実現するコードは以下のとおりです。 <!DOCTYPE html> <html> <head>     <meta charset="utf-8"> &nb