首頁 > 後端開發 > C++ > 如何在保留數字順序的同時按字母順序排列嵌入數字的字串?

如何在保留數字順序的同時按字母順序排列嵌入數字的字串?

Barbara Streisand
發布: 2024-12-30 10:16:14
原創
622 人瀏覽過

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

如何在保留數字值的同時按字母順序對字串進行排序

當某些字串包含數字字元時,按字串包含數字字元時,按字串字母順序對字串進行排序可能會遇到挑戰。如果禁止數位轉換,則需要採用替代方法來有效處理這些情況。

一種解決方案是利用區分數字和非數字值的自訂比較器。這個比較器可以傳遞給 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中文網其他相關文章!

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