ホームページ > バックエンド開発 > C++ > 数値を優先しながら文字列配列をアルファベット順に並べ替えるにはどうすればよいですか?

数値を優先しながら文字列配列をアルファベット順に並べ替えるにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-30 11:15:21
オリジナル
532 人が閲覧しました

How to Sort a String Array Alphabetically While Prioritizing Numerical Values?

文字列配列内の数値に優先順位を付けながらアルファベット順を維持する

文字列をアルファベット順に並べ替えるのは標準的なタスクですが、文字列が数値の順序を維持したまま数値も表現できますか?この課題に対処するソリューションを次に示します。

次のコードを考えてみましょう:

string[] things= new string[] { "105", "101", "102", "103", "90" };

foreach (var thing in things.OrderBy(x => x))
{
    Console.WriteLine(thing);
}
ログイン後にコピー

このコードは、数値文字列の配列をアルファベット順に並べ替えようとしますが、出力は期待どおりではありません:

101, 102, 103, 105, 90
ログイン後にコピー

期待を達成するには出力:

90, 101, 102, 103, 105
ログイン後にコピー

カスタム比較子を OrderBy に渡す必要があります。 Enumerable.OrderBy を使用すると、並べ替え用のカスタム比較子を指定できます。

次に、SemiNumericComparer を使用した実装を示します。

string[] things = new string[] { "paul", "bob", "lauren", "007", "90" };

foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{    
    Console.WriteLine(thing);
}
ログイン後にコピー

SemiNumericComparer クラスは、文字列が数値かどうかを判断するメソッドを定義し、次の機能を提供します。比較メソッド:

public class SemiNumericComparer: IComparer<string>
{
    /// <summary>
    /// Method to 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)
    {
        const int S1GreaterThanS2 = 1;
        const int S2GreaterThanS1 = -1;

        var IsNumeric1 = IsNumeric(s1);
        var IsNumeric2 = IsNumeric(s2);

        if (IsNumeric1 &amp;&amp; IsNumeric2)
        {
            var i1 = Convert.ToInt32(s1);
            var i2 = Convert.ToInt32(s2);

            if (i1 > i2)
            {
                return S1GreaterThanS2;
            }

            if (i1 < i2)
            {
                return S2GreaterThanS1;
            }

            return 0;
        }

        if (IsNumeric1)
        {
            return S2GreaterThanS1;
        }

        if (IsNumeric2)
        {
            return S1GreaterThanS2;
        }

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

の配列に適用した場合文字列の場合、SemiNumericComparer は文字列を最初にアルファベット順に並べ替え、次に数値順に並べ替えて、目的の出力を提供します。

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

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