ホームページ > バックエンド開発 > C++ > 数値の順序を維持しながら、数字が埋め込まれた文字列をアルファベット順に並べるにはどうすればよいですか?

数値の順序を維持しながら、数字が埋め込まれた文字列をアルファベット順に並べるにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-30 10:16:14
オリジナル
624 人が閲覧しました

How to Alphabetize Strings with Embedded Numbers While Preserving Numerical Order?

数値を保持しながら文字列をアルファベット順に並べ替える方法

文字列の一部に数字が含まれている場合、文字列をアルファベット順に並べ替える際に問題が発生する可能性があります。数値変換が禁止されている場合、これらのケースを効果的に処理するには代替アプローチが必要です。

解決策の 1 つは、数値と非数値を区別するカスタム比較子を利用することです。この比較子を OrderBy メソッドに渡して、並べ替え基準をカスタマイズできます。

Enumerable.OrderBy メソッドと SemiNumericComparer クラスを使用した実装例を次に示します。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        string[] things = new string[] { "paul", "bob", "lauren", "007", "90", "101" };

        foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
        {    
            Console.WriteLine(thing);
        }
    }

    public class SemiNumericComparer: IComparer<string>
    {
        /// <summary>
        /// Determine if a string is a number
        /// </summary>
        /// <param name="value">String to test</param>
        /// <returns>True if numeric</returns>
        public static bool IsNumeric(string value)
        {
            return int.TryParse(value, out _);
        }

        /// <inheritdoc />
        public int Compare(string s1, string s2)
        {
            // Flags to indicate if strings are numeric
            var IsNumeric1 = IsNumeric(s1);
            var IsNumeric2 = IsNumeric(s2);

            // Handle numeric comparisons
            if (IsNumeric1 && IsNumeric2)
            {
                var i1 = Convert.ToInt32(s1);
                var i2 = Convert.ToInt32(s2);
                
                // Order by numerical value
                if (i1 > i2)
                {
                    return 1;
                }

                if (i1 < i2)
                {
                    return -1;
                }

                return 0;
            }

            // Handle cases where only one string is numeric
            if (IsNumeric1)
            {
                return -1;
            }

            if (IsNumeric2)
            {
                return 1;
            }

            // Default to alphabetical comparison
            return string.Compare(s1, s2, true, CultureInfo.InvariantCulture);
        }
    }
}
ログイン後にコピー

このコードは、次のソート順の文字列:

007
90
bob
lauren
paul
101
ログイン後にコピー

以上が数値の順序を維持しながら、数字が埋め込まれた文字列をアルファベット順に並べるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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