2014-01-24 9 views
1

Это еще одна домашняя работа здесь. Мне нужно отсортировать студентов по его фамилии и имени (фамилия сначала, а затем второе имя). Полный список студентов должен быть отредактирован по алфавиту.Сортировка по фамилии и имени C#

Что работает до сих пор:

Если я типа в 3-х студентов с одинаковыми фамилиями, сортирует правильно.

Позволяет сказать:

Ричардсон Марк Ричардсон Майк Ричардсон Мэтт

Правильный порядок сортировки является:

Ричардсон Марк Ричардсон Мэтт Ричардсон Майк

Он также работает когда начинается фамилия с той же буквы и выглядят так

Позволяет сказать:

Ричардсон Марк Ричмонд Люк Rikkard Мэтт

Сорта, как:

Ричардсон Марк Ричмонд Люк Rikkard Мэтт

Моя проблема

код не сортировать 3 совершенно другая фамилия-х (и т.д., Ричардсон, Марксон, Bekhs) ...

Пожалуйста, обратите внимание, что только основные функции, могут и должны быть запрограммированы как сильфона!

private static void sortAlpphabetical(Student[] studentList) 
{ 
    for (int i = 1; i < studentList.Length; i++) 
    { 
     for (int j = 0; j < studentList.Length - 1; j++) 
     { 
      string lastName1 = studentList[j].lastName.ToLower() + studentList[j].name.ToLower(); 
      string lastName2 = studentList[j + 1].lastName.ToLower() + studentList[j + 1].name.ToLower(); 
      for (int k = 0; k < lastName1.Length; k++) 
      { 
       if (returnIndex(lastName2[k]) > returnIndex(lastName1[k])) 
       { 
        Student currentStudent = studentList[j]; 
        studentList[j] = studentList[j + 1]; 
        studentList[j + 1] = currentStudent; 
       } 
      } 
     } 
    } 
    Console.WriteLine("List of students:\n"); 
    for (int i = 0; i < studentList.Length; i++) 
    { 
     Console.WriteLine("//code"); 
    } 
} 

Когда я пытаюсь сортировать 3 разные фамилии, это дает мне Индекс находился вне границ массива. Ошибка

Необработанное исключение типа «System.IndexOutOfRangeException» произошло в work.exe

Дополнительная информация: Индекс находился вне границ массива.

+3

Какая линия дает вам эту ошибку? Копия трассировки стека из исключения была бы удобной. –

+0

** если ** строка, я скопировал ошибку и отредактировал вопрос – fkr

ответ

1

к здесь делает предположение, что lastName1 длиннее lastName2

for (int k = 0; k < lastName1.Length; k++) 
{ 
    if (returnIndex(lastName2[k]) > returnIndex(lastName1[k])) 
    { 
     Student currentStudent = studentList[j]; 
     studentList[j] = studentList[j + 1]; 
     studentList[j + 1] = currentStudent; 
    } 
} 

Это должно предотвратить это путем предотвращения цикла проверки за пределы длины которых когда-либо является сокращенный

int shortestNameLength = Math.Min(lastName1.Length, lastName2.Length); 
for (int k = 0; k < shortestNameLength ; k++) 

После некоторого тестирования у вашего алгоритма есть еще одна проблема. Он будет продолжаться по сравнению с последним символом в названии. Он должен остановиться, как только он определил порядок

сравни персонажу

  • Если же, проверить следующий символ
  • Если больше, своп, были сделаны здесь.
  • Если меньше, ничего не делайте, делайте здесь.

Резюмируя, заменить

for (int k = 0; k < lastName1.Length; k++) 
{ 
    if (returnIndex(lastName2[k]) > returnIndex(lastName1[k])) 
    { 
     Student currentStudent = studentList[j]; 
     studentList[j] = studentList[j + 1]; 
     studentList[j + 1] = currentStudent; 
    } 
} 

с

int shortestNameLength = Math.Min(lastName1.Length, lastName2.Length); 
for (int k = 0; k < shortestNameLength ; k++) 
{ 
    int c1 = returnIndex(lastName1[k]); 
    int c2 = returnIndex(lastName2[k]); 
    if (c1 == c2) 
    { 
     continue; 
    } 
    if (c1 > c2) 
    { 
     Student currentStudent = studentList[j]; 
     studentList[j] = studentList[j + 1]; 
     studentList[j + 1] = currentStudent; 
    } 
    break; 
} 

Полный метод выглядит примерно так ...

private static void sortAlpphabetical(Student[] studentList) 
    { 
     for (int i = 1; i < studentList.Length; i++) 
     { 
      for (int j = 0; j < studentList.Length - 1; j++) 
      { 
       string lastName1 = studentList[j].lastName.ToLower() + studentList[j].name.ToLower(); 
       string lastName2 = studentList[j + 1].lastName.ToLower() + studentList[j + 1].name.ToLower(); 
       int shortestNameLength = Math.Min(lastName1.Length, lastName2.Length); 
       for (int k = 0; k < shortestNameLength; k++) 
       { 
        int c1 = returnIndex(lastName1[k]); 
        int c2 = returnIndex(lastName2[k]); 
        if (c1 == c2) 
        { 
         continue; 
        } 
        if (c1 > c2) 
        { 
         Student currentStudent = studentList[j]; 
         studentList[j] = studentList[j + 1]; 
         studentList[j + 1] = currentStudent; 
        } 
        break; 
       } 
      } 
     } 
     Console.WriteLine("List of students:\n"); 
     for (int i = 0; i < studentList.Length; i++) 
     { 
      Console.WriteLine(string.Format("{0} {1}", studentList[i].name, studentList[i].lastName)); 
     } 
    } 
+0

, где я могу добавить это. до или после ** если **? – fkr

+0

@fkr Вместо этого он заменяет if –

+0

, он дает мне точно такую ​​же ошибку на c2 – fkr

0
using System.Linq; 

Student[] sorted = studentList.OrderBy(x=>x.lastName).ThenBy(x=>x.name).ToArray(); 
+0

Я не могу использовать OrderBy. Его нужно заказать, как указано выше. – fkr

+0

Второй должен быть ThenBy. – Carra

+0

Я не могу использовать какие-либо «сложные» функции. Должно быть сделано как мой выше – fkr

0

Просто чешется это в LINQPad, который должен дать вам желаемый результат, если не предполагается использовать для петель и классических массивов.

void Main() 
{ 
    var students = new List<student>() 
    { 
     new student("Alphonso", "Zander"), 
     new student("Berta", "Zander"), 
     new student("Giacomo", "Zander"), 
     new student("Marc", "Lastly"), 
     new student("God", "Allmighty") 
    }; 

    var sortedStudents = students.OrderBy(s => s.lastName).ThenBy(s => s.firstName).Dump(); 
} 

// Define other methods and classes here 
class student 
{ 
    public student(string fname, string lname) 
    { 
    this.firstName = fname; this.lastName = lname; 
    } 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
} 

Выход:

firstName lastName 
God  Allmighty 
Marc  Lastly 
Alphonso Zander 
Berta  Zander 
Giacomo Zander 
+0

Я не могу использовать OrderBy. Это запрещено – fkr

1

Вы должны проверить длину массивы, к которым вы обращаетесь. Если lastName1 не имеет символа со смещением k (то есть lastName1.length == k), то мы знаем, что lastName2 больше, чем lastName1. Если lastName2 не имеет символа со смещением k (то есть lastName2.length <= k), оно не может превышать lastName1.

Изменить

if (returnIndex(lastName2[k]) > returnIndex(lastName1[k])) 

в

if(lastName1.length == k || 
    (lastName2.length > k && 
     returnIndex(lastName2[k]) > returnIndex(lastName1[k]))) 
+0

он не сортирует его правильно. Это сортирует его в том же порядке, что и я набрал его в – fkr

+0

, он действительно сортирует его по-разному каждый раз, когда я пытаюсь – fkr

+0

@fkr см. Мой ответ, почему –

0

Вы можете использовать IComparer интерфейс, чтобы указать порядок объектов.

Это код, который я слом в LINQPad (используя имена, предоставляемые @Serv - да я что ленивый ...)

void Main() 
{ 
    var students = new List<Student>() 
    { 
     new Student("Alphonso", "Zander"), 
     new Student("Berta", "Zander"), 
     new Student("Giacomo", "Zander"), 
     new Student("Marc", "Lastly"), 
     new Student("God", "Allmighty") 
    }; 
    students.Sort(new StudentComparer()); 
    students.Dump(); 
} 

class Student 
{ 
    public Student(string firstName, string lastName) 
    { 
     FirstName = firstName; 
     LastName = lastName; 
    } 
    public string FirstName{get;set;} 
    public string LastName{get;set;} 
} 

class StudentComparer:IComparer<Student> 
{ 
    public int Compare(Student a, Student b) 
    { 
     var lastName = a.LastName.CompareTo(b.LastName); 
     if(lastName == 0) 
      return a.FirstName.CompareTo(b.FirstName); 
     return lastName; 
    } 
} 

Если вы не хотите, чтобы переписать алгоритм сортировки, используемый по методу Sort для вас достаточно кода выше.

И вот результаты:

Results.

+0

Большое вам спасибо, но это не сложная программа, а значит, я не могу использовать ни Icomparer, ни CompareTo. Тематические правила, а не мои = \ – fkr

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