2015-12-19 11 views
5

Okay, ich habe diesen Code unter Verwendung einer Auswahl Art auf ganze Zahlen zu tun:C# Selection Art mit Streichern

public void selectSort(int [] arr) 
{ 
    //pos_min is short for position of min 
    int pos_min,temp; 

    for (int i=0; i < arr.Length-1; i++) 
    { 
     pos_min = i; //set pos_min to the current index of array 

     for (int j=i+1; j < arr.Length; j++) 
     { 
      if (arr[j] < arr[pos_min]) 
      { 
       //pos_min will keep track of the index that min is in, this is needed when a swap happens 
       pos_min = j; 
      }           
     } 

     //if pos_min no longer equals i than a smaller value must have been found, so a swap must occur 
     if (pos_min != i) 
     { 
      temp = arr[i]; 
      arr[i] = arr[pos_min]; 
      arr[pos_min] = temp; 
     } 
    } 
} 

aber jetzt möchte ich stattdessen den gleichen Algorithmus auf eine String-Liste laufen.
Wie konnte das erreicht werden? Es fühlt sich wirklich peinlich an und du brauchst zusätzliche Loops, um mehrere Zeichen verschiedener Strings zu vergleichen ..?
Ich habe viel versucht, aber ich konnte mir nichts Nützliches einfallen lassen. :

Hinweis: Ich weiß, Auswahl Sortierung ist nicht sehr effizient. Dies dient nur zu Lernzwecken. Ich suche keine alternativen Algorithmen oder Klassen, die bereits Teil von C# sind. ;)

+0

Sie können aber Operatoren wie '<', '>', '==' und '! =' Auch für Strings verwenden. Es ist nicht notwendig, die Zeichen zu durchlaufen. –

+0

Nicht wirklich sicher, was Sie suchen - wenn Sie nicht integrierten String-Vergleich verwenden können, müssen Sie eine Art von for-Schleife schreiben, um Zeichen zu vergleichen. –

Antwort

8

Nachdem Sie die Auswahlsortierung für Ganzzahlarrays implementiert haben, möchten Sie die Lösung für die Arbeit mit Arrays beliebigen Typs verallgemeinern. Dies kann mit Generics und der IComparable Schnittstelle geschehen.

Generics ermöglichen es uns, Funktionen mit Typen zu parametrisieren. Dies ist ähnlich wie Sie Funktionen mit Werten parametrieren können.

IComparable ist eine Schnittstelle, die uns eine Funktion namens CompareTo gibt, die ein Vergleichsoperator ist. Dieser Operator funktioniert für alle Typen, die die Schnittstelle IComparable implementieren, die sowohl ganze Zahlen als auch Strings enthält.

// Forall types A where A is a subtype of IComparable 
public void selectSort<A>(A[] arr) 
where A : IComparable 
{ 
    //pos_min is short for position of min 
    int pos_min,temp; 

    for (int i=0; i < arr.Length-1; i++) 
    { 
     pos_min = i; //set pos_min to the current index of array 

     for (int j=i+1; j < arr.Length; j++) 
     { 
      // We now use 'CompareTo' instead of '<' 
      if (arr[j].CompareTo(arr[pos_min]) < 0) 
      { 
       //pos_min will keep track of the index that min is in, this is needed when a swap happens 
       pos_min = j; 
      }           
     } 

     //if pos_min no longer equals i than a smaller value must have been found, so a swap must occur 
     if (pos_min != i) 
     { 
      temp = arr[i]; 
      arr[i] = arr[pos_min]; 
      arr[pos_min] = temp; 
     } 
    } 
} 
+0

Super! Ich danke dir sehr. :) Ich bin allerdings ein bisschen verwirrt. Wird die Hierarchie einfach durch die Indizes der Zeichen in der Unicode-Tabelle bestimmt? Ich frage mich, in welcher Reihenfolge diese Strings sortiert würden: "aa" - "äb" - "ac" und "ea" - "eb" - "ec" – Forivin

+0

Sie können diese ausprobieren und sehen. Sie können auch auf die Dokumentation für [String.CompareTo] (https://msdn.microsoft.com/en-us/library/35f0x18w (v = vs.110) .aspx) verweisen. – erisco

2

Die Klasse System.String hat eine statische int Compare(string, string)-Methode, die eine negative Zahl zurückgibt, wenn die erste Zeichenfolge kleiner als die zweite Zeichenfolge ist, Null, wenn sie gleich sind, und eine positive Ganzzahl, wenn die erste größer ist.

Mit "kleiner" meine ich, dass es in lexikalischer Reihenfolge vor den anderen kommt und dass es in lexikalischer Reihenfolge nach dem anderen kommt.

Daher können Sie String.Compare(arr[j], arr[pos_min]) < 0 anstelle von nur arr[j] < arr[pos_min] für Ganzzahlen vergleichen.