Сортировка и поиск в массивах



 

Содержимое массива нередко приходится сортировать. Для этой цели в классе Array предусмотрен обширный ряд сортирующих методов. Так, с помощью разных вариантов метода Sort() можно отсортировать массив полностью или в заданных пределах либо отсортировать два массива, содержащих соответствующие пары "ключ-значение". После сортировки в массиве можно осуществить эффективный поиск, используя разные варианты метода BinarySearch(). В качестве примера ниже приведена программа, в которой демонстрируется применение методов Sort() и BinarySearch() для сортировки и поиска в массиве значений типа int.

 

// Отсортировать массив и найти в нем значение.

using System;

class SortDemo {

static void Main() {

int[] nums = { 5, 4, 6, 3, 14, 9, 8, 17, 1, 24, -1, 0 };

 

Отобразить исходный порядок следования.

Console.Write("Исходный порядок следования: ");

Foreach(int i in nums)

Console.Write(i + " ") ;

 

Console.WriteLine();

 

Отсортировать массив.

Array.Sort(nums);

 

Отобразить порядок следования после сортировки.

Console.Write("Порядок следования после сортировки: ");

Foreach(int i in nums)

Console.Write(i + " ");

 

Console.WriteLine();

 

Найти значение 14.

int idx = Array.BinarySearch(nums, 14);

Console.WriteLine("Индекс элемента массива со значением 14: " + idx) ;

}

}

 

Вот к какому результату приводит выполнение этой программы.

 

Исходный порядок следования: 5 4 6 3 14 9 8 17 1 24 -1 0

Порядок следования после сортировки: -1 0 1 3 4 5 6 8 9 14 17 24

Индекс элемента массива со значением 14: 9

 

В приведенном выше примере массив состоит из элементов типа int, который относится к категории типов значений. Все методы, определенные в классе Array, автоматически доступны для обработки массивов всех встроенных в C# типов значений. Но в отношении массивов ссылок на объекты это правило может и не соблюдаться. Так, для сортировки массива ссылок на объекты в классе типа этих объектов должен быть реализован интерфейс IComparable или IComparable<T>. Если же ни один из этих интерфейсов не реализован в данном классе, то во время выполнения программы может возникнуть исключительная ситуация в связи с попыткой отсортировать подобный массив или осуществить в нем поиск. Правда, реализовать оба интерфейса, IComparable и IComparable<T>, совсем нетрудно.

В интерфейсе IComparable определяется один метод.

 

Int CompareTo(object obj)

 

В этом методе значение вызывающего объекта сравнивается со значением объекта, определяемого параметром obj. Если значение вызывающего объекта больше, чем у объекта obj, то возвращается положительное значение; если оба значения равны — нулевое значение, а если значение вызывающего объекта меньше, чем у объекта obj, — отрицательное значение.

Интерфейс IComparable<T> является обобщенным вариантом интерфейса IComparable. Поэтому в нем определен следующий обобщенный вариант метода CompareTo().

 

Int CompareTo(Т other)

 

Обобщенный вариант метода CompareTo() действует аналогично необобщенному его варианту. В нем значение вызывающего объекта также сравнивается со значением объекта, определяемого параметром other. Если значение вызывающего объекта больше, чем у объекта other, то возвращается положительное значение; если оба значения равны — нулевое значение, а если значение вызывающего объекта меньше, чем у объекта other, — отрицательное значение. Преимущество интерфейса IComparable<T> заключается в том, что он обеспечивает типовую безопасность, поскольку в этом случае тип обрабатываемых данных указывается явным образом, а следовательно, никакого приведения типа object сравниваемого объекта к нужному типу не требуется. В качестве примера ниже приведена программа, в которой демонстрируются сортировка и поиск в массиве объектов определяемого пользователем класса.

 

// Отсортировать массив объектов и осуществить в нем поиск,

using System;

class MyClass : IComparable<MyClass> {

public int i;

public MyClass(int x) {

i = x;

}

// Реализовать интерфейс IComparable<MyClass>.

public int CompareTo(MyClass v) {

return i - v.i;

}

public bool Equals(MyClass v) {

return i == v.i;

}

}

 

class SortDemo {

static void Main() {

MyClass[] nums = new MyClass[5];

nums[0] = new MyClass(5);

nums[1] = new MyClass(2);

nums[2] = new MyClass(3);

nums[3] = new MyClass(4);

nums[4] = new MyClass(1);

 


Дата добавления: 2019-02-12; просмотров: 271; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!