>백엔드 개발 >C++ >숫자 순서를 유지하면서 포함된 숫자로 문자열을 알파벳순으로 정렬하는 방법은 무엇입니까?

숫자 순서를 유지하면서 포함된 숫자로 문자열을 알파벳순으로 정렬하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-30 10:16:14634검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.