2014-01-16 2 views
0

У меня есть задача в школе, где я должен заказать массив с фамилией: "Čop", "Dugonik" and "Caf" по словенскому алфавиту. Без "Čop" он работает с простым "bubble sort", но с "Čop" я не могу заставить его работать. Я сравниваю символы по таблице ASCII. Словенский алфавит идет: A, B, C, Č, D, ... Любые идеи? Он работает, когда я сортирую его по алфавиту ENG. Я сравниваю 2 фамилии с этой функцией (+ 1 простая функция пузырьковой сортировки для сортировки):Как сортировать слова с пользовательскими символами (без метода сортировки/функции)?

static bool Uredi(Stranka stranka1, Stranka stranka2) 
    { 
     bool prviJeManjši = false; 
     int dolžinaKrajšegaPriimka; 

     // zagotovi da nebo prvi priimek daljši od drugega 
     if (stranka1.priimek.Length > stranka2.priimek.Length) 
     { 
      dolžinaKrajšegaPriimka = stranka2.priimek.Length; 
     } 
     else 
     { 
      dolžinaKrajšegaPriimka = stranka1.priimek.Length; 
     } 

     for (int i = 0; i < dolžinaKrajšeBesede; i++) 
     { 
      if ((char)stranka1.priimek[i] < (char)stranka2.priimek[i]) 
      { 
       prviJeManjši = true; 
       break; 
      } 
     } 
     return prviJeManjši; 
    } 
+0

Любой код для публикации? –

+3

Вы должны полностью отделить свой алгоритм сортировки от своего компаратора. У вас должен быть компаратор, который несет исключительную ответственность, чтобы получить две строки и указать, что на первом месте. Затем алгоритм сортировки может быть предоставлен для сравнения, а затем может сортировать что угодно, исходя из любых критериев. – Servy

+0

Сравнение строк по умолчанию для меня дает результаты, которые вы говорите, что они должны. – Servy

ответ

-1

Вы должны реализовать интерфейс IComparer или сравнения делегата. Вот способ сделать это с лямбда-выражения

 List<String> list = new List<string>() { "Čop", "Dugonik", "Caf" }; 
     string alphabet = "ABCČDEFGHIJKLMNOPQRSTUVWXYZ"; 
     list.Sort((s1,s2) => 
     { 
      s1 = s1.ToUpper(); 
      s2 = s2.ToUpper(); 
      if (s1 != s2) 
      { 
       for (int i = 0; i < s1.Length; i++) 
       { 
        if (s1[i] != s2[i]) 
        { 
         int index1 = alphabet.IndexOf(s1[i]); 
         int index2 = alphabet.IndexOf(s2[i]); 
         if (index1 != index2) 
          return index1 - index2; 
        } 
       } 
      } 
      return 0; 
     }); 
     list.ForEach(i => Console.WriteLine(i)); 
     Console.ReadKey(); 

Конечно вам нужно будет изменить алфавит ..
Кстати, я хочу кусок класса, а также :)

Вы можете также изменить текущую культуру на слованский

System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("sl-SI"); 
System.Threading.Thread.CurrentThread.CurrentCulture = ci; 
System.Threading.Thread.CurrentThread.CurrentUICulture = ci; 
+0

Выполнение 'ToUpper' перед сортировкой обычно не всегда является хорошей идеей. Это может сработать в этом случае, но в греческом, где у них есть капитал I с точкой и в нижнем регистре. Я без точки, вам нужно быть осторожным в отношении «ToUpper», потому что это может не сделать правильное письмо в верхнем регистре. – Chris

Смежные вопросы