Maison > développement back-end > C++ > Comment alphabétiser des chaînes avec des nombres intégrés tout en préservant l'ordre numérique ?

Comment alphabétiser des chaînes avec des nombres intégrés tout en préservant l'ordre numérique ?

Barbara Streisand
Libérer: 2024-12-30 10:16:14
original
622 Les gens l'ont consulté

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

Comment trier les chaînes par ordre alphabétique tout en préservant les valeurs numériques

Le tri des chaînes par ordre alphabétique peut rencontrer des problèmes lorsque certaines chaînes contiennent des caractères numériques. Si la conversion numérique est interdite, une approche alternative est nécessaire pour gérer ces cas efficacement.

Une solution consiste à utiliser un comparateur personnalisé qui fait la distinction entre les valeurs numériques et non numériques. Ce comparateur peut être transmis à la méthode OrderBy pour personnaliser les critères de tri.

Voici un exemple d'implémentation utilisant la méthode Enumerable.OrderBy et une classe 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);
        }
    }
}
Copier après la connexion

Ce code affichera le chaînes dans l'ordre trié suivant :

007
90
bob
lauren
paul
101
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal