Heim > Backend-Entwicklung > C++ > Wie sortiere ich ein String-Array alphabetisch und priorisiere dabei numerische Werte?

Wie sortiere ich ein String-Array alphabetisch und priorisiere dabei numerische Werte?

Patricia Arquette
Freigeben: 2024-12-30 11:15:21
Original
531 Leute haben es durchsucht

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

Aufrechterhaltung der alphabetischen Reihenfolge bei gleichzeitiger Priorisierung numerischer Werte in String-Arrays

Das alphabetische Sortieren von Strings ist eine Standardaufgabe, aber wie gehen Sie mit Szenarien um, in denen Strings auch Zahlen darstellen und dabei die numerische Reihenfolge beibehalten? Hier ist eine Lösung, die diese Herausforderung bewältigt.

Betrachten Sie den folgenden Code:

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

foreach (var thing in things.OrderBy(x => x))
{
    Console.WriteLine(thing);
}
Nach dem Login kopieren

Dieser Code versucht, ein Array numerischer Zeichenfolgen alphabetisch zu sortieren, aber die Ausgabe ist nicht wie gewünscht:

101, 102, 103, 105, 90
Nach dem Login kopieren

Um die erwartete Ausgabe zu erzielen:

90, 101, 102, 103, 105
Nach dem Login kopieren

Sie müssen einen benutzerdefinierten Vergleicher übergeben OrderBy. Mit Enumerable.OrderBy können Sie einen benutzerdefinierten Vergleicher zum Sortieren angeben.

Hier ist eine Implementierung mit einem SemiNumericComparer:

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

foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{    
    Console.WriteLine(thing);
}
Nach dem Login kopieren

Die SemiNumericComparer-Klasse definiert eine Methode, um zu bestimmen, ob eine Zeichenfolge numerisch ist, und stellt bereit eine Vergleichsmethode:

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);
    }
}
Nach dem Login kopieren

Bei Anwendung auf das Array von Zeichenfolgen wird die SemiNumericComparer sortiert die Zeichenfolgen zuerst nach alphabetischer Reihenfolge und dann nach numerischem Wert und liefert so die gewünschte Ausgabe.

Das obige ist der detaillierte Inhalt vonWie sortiere ich ein String-Array alphabetisch und priorisiere dabei numerische Werte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage