首頁 > 後端開發 > C++ > 如何按字母順序對字串陣列進行排序,同時對數值進行優先排序?

如何按字母順序對字串陣列進行排序,同時對數值進行優先排序?

Patricia Arquette
發布: 2024-12-30 11:15:21
原創
542 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板