string.indexOf() の内部

DDD
リリース: 2025-01-17 08:27:08
オリジナル
115 人が閲覧しました

string.indexOf() under the hood

開発者の皆さん、こんにちは!

今日は、indexOf() メソッドを一から実装してみました。これまでのところ、次のことを発見しました:

<code class="language-javascript">function myIndexOf(string, target, start = 0) {
    let l = target.length;

    // 调整起始索引,如果它是负数
    if (start < 0) {
        start = string.length + start;
    }

    // 确保起始索引在字符串长度范围内
    if (start < 0) {
        start = 0;
    } else if (start >= string.length) {
        return -1; // 目标索引超出字符串范围
    }

    // 循环遍历字符串
    for (let i = start; i <= string.length - l; i++) {
        if (string.substring(i, i + l) === target) {
            return i; // 找到目标子串
        }
    }

    return -1; // 未找到目标子串
}</code>
ログイン後にコピー

コードの説明:

indexOf() メソッドは 3 つのパラメータを受け入れます:

  1. string: 検索する文字列。
  2. target: 検索する部分文字列。
  3. start: 検索を開始するインデックス (デフォルトは 0)。

私の最初の試み:

私の最初のアイデアは単純で、文字列をループし、string[i] === target が見つかったら i を返すというものでした。ループの最後に一致するものが見つからない場合は、-1 が返されます。コードは次のとおりです:

<code class="language-javascript">// 此方法仅适用于单个字符的目标</code>
ログイン後にコピー

ただし、文字ごとに比較するため、この方法は target が 1 文字の場合にのみ機能します。

2 回目の試み:

その後、target が 1 文字より長い場合は部分文字列を比較する必要があることに気付きました。 substr() メソッドを使用して、target と同じ長さの部分文字列を比較します。ループは、文字列内に比較するのに十分な文字が残ったときに停止するように調整されています:

<code class="language-javascript">// 此方法处理多字符目标,但未处理start参数</code>
ログイン後にコピー

3 回目の試み:

次に、start パラメータを処理する必要があります。これは負の値になる可能性があります。組み込みの indexOf() メソッドは、start が負の場合に string.length start から検索を開始します。たとえば、文字列の長さが 10 で、start が -4 の場合、検索はインデックス 6 (つまり 10 - 4) から開始されます。

これを修正するために、負の start 値を処理するようにコードを更新しました:

<code class="language-javascript">function myIndexOf(string, target, start = 0) {
    let l = target.length;

    if (start < 0) {
        start = string.length + start;
    }

    // ... (其余代码与第二次尝试相同)
}</code>
ログイン後にコピー

最終バージョン:

好奇心から、文字列の長さよりも大きい start 値を処理したいと思い、start が文字列の長さを超えた場合に関数を「ラップアラウンド」し続けるように関数を変更することにしました。弦。このようにして、関数はラップした後も適切なインデックスから検索を続けます。最終的なソリューションでは、次の式を使用して開始インデックスを調整します:

<code class="language-javascript">start = (string.length + start) % string.length;</code>
ログイン後にコピー

仕組み:

  • モジュロ演算子start % string.lengthは、startが-string.lengthからstring.lengthの範囲内にあることを保証します。
  • 否定的な結果が確実に肯定的な結果になるように string.length を追加しました。
  • の最後のモジュロ演算により、start の値がラップアラウンドされ、有効なインデックス範囲内に収まることが保証されます。

次は線形探索の代わりに二分探索を使用したいのですが、どう思いますか?

以上がstring.indexOf() の内部の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート