首页 > 后端开发 > C++ > 如何在保留数字顺序的同时按字母顺序排列嵌入数字的字符串?

如何在保留数字顺序的同时按字母顺序排列嵌入数字的字符串?

Barbara Streisand
发布: 2024-12-30 10:16:14
原创
640 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板