Maison > développement back-end > C++ > Comment trier un tableau de chaînes par ordre alphabétique tout en hiérarchisant les valeurs numériques ?

Comment trier un tableau de chaînes par ordre alphabétique tout en hiérarchisant les valeurs numériques ?

Patricia Arquette
Libérer: 2024-12-30 11:15:21
original
534 Les gens l'ont consulté

How to Sort a String Array Alphabetically While Prioritizing Numerical Values?

Maintenir l'ordre alphabétique tout en hiérarchisant les valeurs numériques dans les tableaux de chaînes

Le tri des chaînes par ordre alphabétique est une tâche standard, mais comment gérer les scénarios dans lesquels les chaînes représenter également des nombres tout en conservant l'ordre numérique ? Voici une solution qui répond à ce défi.

Considérez le code suivant :

string[] things= new string[] { "105", "101", "102", "103", "90" };

foreach (var thing in things.OrderBy(x => x))
{
    Console.WriteLine(thing);
}
Copier après la connexion

Ce code tente de trier un tableau de chaînes numériques par ordre alphabétique, mais le résultat n'est pas celui souhaité :

101, 102, 103, 105, 90
Copier après la connexion

Pour obtenir le résultat attendu :

90, 101, 102, 103, 105
Copier après la connexion

vous devez transmettre un comparateur personnalisé dans Commander par. Enumerable.OrderBy vous permet de spécifier un comparateur personnalisé pour le tri.

Voici une implémentation utilisant un SemiNumericComparer :

string[] things = new string[] { "paul", "bob", "lauren", "007", "90" };

foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{    
    Console.WriteLine(thing);
}
Copier après la connexion

La classe SemiNumericComparer définit une méthode pour déterminer si une chaîne est numérique et fournit une méthode de comparaison :

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);
    }
}
Copier après la connexion

Lorsqu'il est appliqué au tableau de chaînes, le SemiNumericComparer trie les chaînes d'abord par ordre alphabétique, puis par valeur numérique, fournissant le résultat souhaité.

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