Сортировка и поиск. Статические методы класса 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 ∙ Интерфейс 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 ∙ Размерность массива
Таблица 12.2. Статические методы класса Array