Сортировка и поиск. Статические методы класса Array
Статические методы класса Array позволяют решать самые разнообразные задачи:
- Copy - позволяет копировать весь массив или его часть в другой массив.
- IndexOf, LastIndexOf - определяют индексы первого и последнего вхождения образца в массив, возвращая -1, если такового вхождения не обнаружено.
- Reverse - выполняет обращение массива, переставляя элементы в обратном порядке.
- Sort - осуществляет сортировку массива.
- BinarySearch - определяет индекс первого вхождения образца в отсортированный массив, используя алгоритм двоичного поиска.
Все методы перегружены и имеют ряд модификаций. Большинство из этих методов применимо только к одномерным массивам. Приведу примеры различных операций, доступных при работе с массивами, благодаря наследованию от класса Array:
public void TestCollection() { //операции над массивами int nc = 7; int[] col1 = new int[nc], col2 = new int[nc]; double[] col3 = new double[nc]; int[,] col4 = new int[2,2]; Arrs.CreateCollection(col1); Arrs.PrintCollection("col1",col1); Arrs.CreateCollection(col2); Arrs.PrintCollection("col2",col2); Arrs.CreateCollection(col3); Arrs.PrintCollection("col3",col3); Arrs.CreateTwoDimAr(col4); Arrs.PrintCollection("col4",col4); //сортировка, поиск, копирование // поиск элемента int first = Array.IndexOf(col1, 2); int last = Array.LastIndexOf(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,col2,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.CreateInstance(typeof(double), 2,3); Arrs.PrintCollection("my2Dar",my2Dar); //клонирование my2Dar = (Array)col4.Clone(); Console.WriteLine("Массив my2Dar после клонирования col4:"); Arrs.PrintCollection("my2Dar",my2Dar); //копирование CopyTo col1.CopyTo(col2,0); Console.WriteLine("Массив col2 после копирования col1:"); Arrs.PrintCollection("col2",col2); }
В этой процедуре продемонстрированы вызовы различных статических методов класса Array. Для метода Copy показан вызов двух реализаций этого метода, когда копируется весь массив и часть массива. Закомментированный оператор вызова метода IndexOf напоминает о невозможности использования методов поиска при работе с многомерными массивами. Приведу результаты вывода, порожденные этим кодом.
Рис. 12.3. Результаты применения статических методов класса Array
IsFixedSize | Интерфейс IList | True, если массив статический |
IsReadOnly | Интерфейс IList | Для всех массивов имеет значение false |
IsSynchronized | Интерфейс ICollection | True или False, в зависимости от того, установлена ли синхронизация доступа для массива |
SyncRoot | Интерфейс ICollection | Собственный метод синхронизации доступа к массиву. При работе с массивом его можно закрыть на время обработки, что запрещает его модификацию каким-либо потоком: Array myCol = new int[]; lock( myCol.SyncRoot ) { foreach ( Object item in myCol ) { // безопасная обработка массива } |
Length | Число элементов массива | |
Rank | Размерность массива |
BinarySearch | Двоичный поиск. Описание и примеры даны в тексте |
Clear | Выполняет начальную инициализацию элементов. В зависимости от типа элементов устанавливает значение 0 для арифметического типа, false - для логического типа, Null для ссылок, "" - для строк. |
Copy | Копирование части или всего массива в другой массив. Описание и примеры даны в тексте |
CreateInstance | Класс Array, в отличие от многих классов, может создавать свои экземпляры не только с помощью конструктора new, но и при вызове метода CreateInstance: Array my2Dar = Array.CreateInstance(typeof(double), 2,2) |
IndexOf | Индекс первого вхождения образца в массив. Описание и примеры даны в тексте |
LastIndexOf | Индекс последнего вхождения образца в массив. Описание и примеры даны в тексте |
Reverse | Обращение одномерного массива. Описание и примеры даны в тексте |
Sort | Сортировка массива. Описание и примеры даны в тексте |