Выбрать главу

Сортировка и поиск. Статические методы класса Array

Статические методы класса Array позволяют решать самые разнообразные задачи:

1. Сору — позволяет копировать весь массив или его часть в другой массив.

2. IndexOf, Last IndexOf — определяют индексы первого и последнего вхождения образца в массив, возвращая -1, если такового вхождения не обнаружено.

3. Reverse — выполняет обращение массива, переставляя элементы в обратном порядке.

4. Sort — осуществляет сортировку массива.

5. Binary Search — определяет индекс первого вхождения образца в отсортированный массив, используя алгоритм двоичного поиска.

Все методы перегружены и имеют ряд модификаций. Большинство из этих методов применимо только к одномерным массивам. Приведу примеры различных операций, доступных при работе с массивами, благодаря наследованию от класса Array:

public void TestCollection ()

{

     //операции над массивами

     int nc = 7;

     int[] col1 = new int[nc], col2 = new

     int[nc]; doublet] col3 = new double[nc];

     int[,] col4 = new int [2,2];

     Arrs.CreateCollection(col1);

     Arrs.PrintCollection("col1", col1);

     Arrs.CreateCollection(col2);

     Arrs.PrintCollection("соl2",соl2);

     Arrs.CreateCollection (col3);

     Arrs.PrintCollection("соl3",соl3);

     Arrs.CreateTwoDimAr (col4);

     Arrs.PrintCollection("соl4",соl4);

     // сортировка, поиск, копирование

     // поиск элемента

     int first = Array.IndexOf(coll, 2);

     int last = Array.LastlndexOf(col1,2);

     if (first == -1)

          Console.WriteLine("Нет вхождений 2 в массив col1");

     else if (first ==last)

          Console.WriteLine("Одно вхождение 2 в массив col1");

     else

          Console.WriteLine("Несколько вхождений 2 в массив col1");

     //first = Array.IndexOf(col4, 4);

     // только одномерный массив

     Array.Reverse(col1);

     Console.WriteLine("Обращение массива col1: ");

     Arrs.PrintCollection("col1",col1);

     // Копирование

     Array.Copy(col1, col3, col1.Length);

     Console.WriteLine(" Массив col3 после копирования массива col1: ");

     Arrs. PrintCollection ("col3", col3);

     Array.Copy(col1,1,соl2,1,2);

     Console.WriteLine("копирование двух элементов col1 в col2:");

     Arrs.PrintCollection("col1", col1);

     Arrs.PrintCollection("col2",col2);

     // быстрая сортировка Хоара Array.Sort(col1);

     Console.WriteLine("Отсортированный массив col1: ");

     Arrs.PrintCollection("col1",col1);

     first = Array.BinarySearch(col1, 2);

     Console.WriteLine("Индекс вхождения 2 в col1: {0}",first);

     //Создание экземпляра (массива)

     Array my2Dar = Array.Createlnstance(typeof(double), 2,3);

     Arrs.PrintCollection("my2Dar",my2Dar);

     //клонирование

     my2Dar = (Array)col4.Clone();

     Console.WriteLine("Массив my2Dar после клонирования col4: ");

     Arrs.PrintCollection("my2Dar",my2Dar);

     //копирование CopyTo col1.CopyTo (соl2, 0);

     Console.WriteLine("Массив col2 после копирования col1: ");

     Arrs.PrintCollection("col2",col2);

}

В этой процедуре продемонстрированы вызовы различных статических методов класса Array. Для метода Сору показан вызов двух реализаций этого метода, когда копируется весь массив и часть массива. Закомментированный оператор вызова метода IndexOf напоминает о невозможности использования методов поиска при работе с многомерными массивами. Приведу результаты вывода, порожденные этим кодом.

Рис. 12.3. Результаты применения статических методов класса Array

Таблица 12.1. Свойства класса Array

Свойство ∙ Родитель ∙ Описание

IsFixedSize ∙ Интерфейс IListTrue, если массив статический

IsReadOnly ∙ Интерфейс IList ∙ Для всех массивов имеет значение false

IsSynchronized ∙ Интерфейс ICollectionTrue или False, в зависимости оттого, установлена ли синхронизация доступа для массива

SyncRoot ∙ Интерфейс ICollection

Собственный метод синхронизации доступа к массиву. При работе с массивом его можно закрыть на время обработки, что запрещает его модификацию каким-либо потоком:

Array myCol = new int [];

lock(myCol.SyncRoot) {

foreach (Object item in myCol)

{

// безопасная обработка массива }

Length ∙ Число элементов массива ∙

Rank ∙ Размерность массива

Таблица 12.2. Статические методы класса Array