2015-12-19 8 views
5

Va bene, ho usato questo codice per fare una selezione sorta su interi:C# Selezione sorta con le stringhe

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; 
     } 
    } 
} 

ma ora voglio correre lo stesso algoritmo in un elenco stringa invece.
Come potrebbe essere realizzato? Sembra davvero imbarazzante e come se avessi bisogno di loop aggiuntivi per confrontare più caratteri di stringhe diverse ...?
Ho provato molto, ma non sono riuscito a trovare nulla di utile. :/

Nota: Lo so, l'ordinamento di selezione non è molto efficiente. Questo è solo per scopi di apprendimento. Non sto cercando algoritmi alternativi o classi che fanno già parte di C#. ;)

+0

Ma è possibile utilizzare anche operatori come '<', '>', '==' e '! =' Per le stringhe. Non è necessario scorrere i personaggi. –

+0

Non proprio quello che stai cercando - se non puoi usare il confronto di stringhe incorporato devi scrivere una sorta di ciclo per confrontare i caratteri. –

risposta

8

Ora che è stato implementato l'ordinamento di selezione per gli array di numeri interi, si desidera generalizzare la soluzione affinché funzioni con matrici di qualsiasi tipo. Questo può essere fatto con generici e l'interfaccia IComparable.

I generici consentono di parametrizzare le funzioni con i tipi. Questo è simile a come è possibile parametrizzare le funzioni con i valori.

IComparable è un'interfaccia che ci dà una funzione chiamata CompareTo, che è un operatore di confronto. Questo operatore funziona per tutti i tipi che implementano l'interfaccia IComparable, che include sia numeri interi che stringhe.

// 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

Fantastico! Grazie mille. :) Sono un po 'confuso però. La gerarchia è determinata semplicemente dagli indici dei caratteri nella tabella Unicode? Mi chiedo in quale ordine sarebbero ordinate queste stringhe: "aa" - "äb" - "ac" e "ea" - "éb" - "ec" – Forivin

+0

Puoi provare quelli e vedere. Inoltre, è possibile fare riferimento alla documentazione di [String.CompareTo] (https://msdn.microsoft.com/en-us/library/35f0x18w (v = vs.110) .aspx). – erisco

2

La classe System.String ha un int Compare(string, string) metodo statico che restituisce un numero negativo se la prima stringa è minore del secondo, zero se sono uguali, e un intero positivo se la prima è maggiore.

Con "più piccolo" intendo che viene prima dell'altro nell'ordine lessicale e più grande che viene dopo l'altro in ordine lessicale.

Pertanto è possibile confrontare String.Compare(arr[j], arr[pos_min]) < 0 anziché solo arr[j] < arr[pos_min] per i numeri interi.