Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритми та структури даних ЗПІ-91-20210115T104612Z-001 / Лекція 5. Спискові структури даних.doc
Скачиваний:
33
Добавлен:
15.01.2021
Размер:
450.56 Кб
Скачать

6. Порівняння і сортування елементів списку

Для сортування елементів списку є 4 методи:

Sort() - сортує елементи в усьому списку List<T> за допомогою компаратора за замовчанням.

Sort(Comparison<T>) - сортує елементи в усьому списку List<T> з використанням вказаного делегата System.Comparison<T>.

Sort(IComparer<T>) - сортує елементи в усьому списку List<T> за допомогою вказаного компаратора.

Sort(Int32, Int32, IComparer<T>) - сортує елементи в діапазоні елементів списку List<T> за допомогою вказаного компаратора.

Приклад 5. Використання методу Sort()

https://msdn.microsoft.com/ru-ru/library/b0zbh7b6(v=vs.110).aspx

У наступному прикладі демонструється метод Sort() і метод BinarySearch(T). Створюється список рядків List<T>, який заповнюється чотирма рядками в довільному порядку. Список виводиться, сортується і потім виводиться знову.

Потім використовується метод BinarySearch(T) для пошуку двох рядків, не включених у список, і ці рядки вставляються за допомогою методу Insert. Результат виконання методу BinarySearch буде негативним в кожному випадку, оскільки рядки не входять у список. Порозрядне доповнення (оператор ~ в C# і Visual C++, Xor - 1 в Visual Basic) цього негативного числа дає індекс першого елементу в списку, більшого, ніж шуканий рядок, і вставка в цю позицію дозволяє зберегти порядок сортування. Другий шуканий рядок більше будь-якого елементу списку, тому позиція вставки доводиться на кінець списку.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Lab

{

public class Example

{

public static void Main()

{

List<string> dinosaurs = new List<string>();

dinosaurs.Add("Pachycephalosaurus");

dinosaurs.Add("Amargasaurus");

dinosaurs.Add("Mamenchisaurus");

dinosaurs.Add("Deinonychus");

Console.WriteLine();

foreach (string dinosaur in dinosaurs)

{

Console.WriteLine(dinosaur);

}

Console.WriteLine("\nSort");

dinosaurs.Sort();

Console.WriteLine();

foreach (string dinosaur in dinosaurs)

{

Console.WriteLine(dinosaur);

}

Console.WriteLine("\nBinarySearch and Insert \"Coelophysis\":");

int index = dinosaurs.BinarySearch("Coelophysis");

if (index < 0)

{

dinosaurs.Insert(~index, "Coelophysis");

}

Console.WriteLine();

foreach (string dinosaur in dinosaurs)

{

Console.WriteLine(dinosaur);

}

Console.WriteLine("\nBinarySearch and Insert \"Tyrannosaurus\":");

index = dinosaurs.BinarySearch("Tyrannosaurus");

if (index < 0)

{

dinosaurs.Insert(~index, "Tyrannosaurus");

}

Console.WriteLine();

foreach (string dinosaur in dinosaurs)

{

Console.WriteLine(dinosaur);

}

Console.ReadKey();

}

}

}

Приклад 6. Використання методу Sort() для сортування списку об’єктів класу

Для пошуку і сортування об’єктів класів необхідно зробити клас, який реалізує об’єкти нащадком інтерфейсу IComparable<Т> і реалізувати метод CompareTo().

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Lab

{

public class Person: IComparable<Person>

{

public string Name { get; set; } //имя

public int Age { get; set; } // возраст

public int Height { get; set; }

public string Role { get; set; } // роль

public string GetName() { return Name; }

public int GetAge() { return Age; }

public Person(string n, int age, int h)

{

this.Name = n;

this.Age = age;

this.Height = h;

}

public int CompareTo(Person p)

{

//Порівняння об'єктів за віком

Person pers = p as Person;

if (pers != null)

return this.Age.CompareTo(p.Age);

else

throw new ArgumentException("об'єкт не належить до типу Person");

}

public void Passport()

{

Console.WriteLine("Name = {0} Age = {1} Height = {2} ", Name, Age, Height);

}

}

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Сортування списку ");

List<Person> pers = new List<Person>();

pers.Add(new Person("Іванов", 18, 176));

pers.Add(new Person("Петров", 20, 180));

pers.Add(new Person("Морозов", 21, 170));

pers.Add(new Person("Соколов", 30, 170));

pers.Add(new Person("Авілов", 25, 176));

Console.WriteLine("Колекція до сортування");

foreach (Person elem in pers) elem.Passport();

pers.Sort();

Console.WriteLine("Колекція після сортування за віком");

foreach (Person elem in pers) elem.Passport();

Console.ReadKey();

}

} }

Для порівняння об’єктів за двома критеріями потрібно зробити клас нащадком інтерфейсу IComparer<T>.

Приклад (до курсової роботи)

В цьому прикладі в консольному проекті створюється клас Student з трьома конструкторами. Перший конструктор ініціалізує властивості класу при створенні об’єкту класу. Використовується при додаванні об’єкту в програмі. Другий конструктор приймає як параметр рядок тексту, прочитаний з файлу, виділяє з нього характеристики і призначає їх властивостям класу. Цей конструктор використовується для додавання студента до колекції. Третій конструктор – без параметрів.

Опис класу Student:

class Student: IComparable<Student>

{

//Властивості

public string FirstName { get; set; } //ім'я

public string LastName { get; set; } //прізвище

public int Course { get; set; }

public int Rating { get; set; }

public Student(string f, string n, int cource, int rating)

{

//перший конструктор з параметрами

//ініціалізація властивостей класу

LastName = f;

FirstName = n;

Course = cource;

Rating = rating;

}

public Student(string s)

{

// другий конструктор приймає рядок тексту, прочитаний з файлу, як параметр,

// виділяє з нього слова і призначає їх властивостям класу.

string[] split = s.Split(new Char[] { '*' });

LastName = split[0].Trim();

FirstName = split[1].Trim();

Course = int.Parse(split[2].Trim());

Rating = int.Parse(split[3].Trim());

}

public Student()

{

// третій конструктор без параметрів

}

// методи класу

public void St_Rating(int student_rating)

{

if (student_rating >= 82)

Console.WriteLine("Привіт відмінникам");

else

if (student_rating <= 45)

Console.WriteLine("Перездача! Треба краще вчитися!");

else

Console.WriteLine("Можна вчитися ще краще!");

}

public int CompareTo(Student s)

{

//Порівняння об'єктів за рейтингом

Student stud = s as Student;

if (stud != null)

return this.Rating.CompareTo(s.Rating);

else

throw new ArgumentException("об'єкт не належить до типу Student");

}

public void Passport()

{

Console.WriteLine("LastName = {0} FirstName = {1} Course = {2} Rating = {3}", LastName, FirstName, Course, Rating);

}

}

У програмі виконується робота зі списком студентів.

class Program

{

static void Main(string[] args)

{

List<Student> listStudent = new List<Student>(); //список студентів

string s;

StreamReader f = new StreamReader("Students.txt");

while ((s = f.ReadLine()) != null)

{

listStudent.Add(new Student(s)); //створення об'єктів і додавання в колекцію

}

f.Close();

//робота зі списком

//початкова колекція

foreach (Student stud in listStudent)

stud.Passport();

listStudent.Sort();

Console.WriteLine("Колекція після сортування за рейтингом");

foreach (Student stud in listStudent)

stud.Passport();

//додати ще студента

listStudent.Add(new Student("Зайченко","Артем",2,75));

Console.WriteLine("Колекція після додавання");

foreach (Student stud in listStudent)

stud.Passport();

Console.ReadKey();

}

}