Г. Шилдт - Полный справочник по C# (1160789), страница 98
Текст из файла (страница 98)
19.12.Класс Array решшзует следующие интерфейсы: icioneable, iCollection,IEnumerable и iList. Интерфейсы ICollection, IEnumerable и iList определеныв пространстве имен System. Collections и описаны в главе 22.Глава 19. Пространство имен System523В ряде методов класса Array используется параметр интерфейсного типаIComparer.Вэтоминтерфейсе,принадлежащемпространствуименS y s t e m . C o l l e c t i o n s , определен метод Compare (), который сравнивает значениядвух объектов.i n t Compare(object vl, o b j e c t v2)Этот метод возвращает положительное число, если значение vl больше значенияv2, отрицательное число, если vl меньше v2, и нуль, если сравниваемые значенияравны.В следующих разделах демонстрируется выполнение наиболее употребимых операций над массивами.Сортировка массивов и поиск заданного элементаОдной из наиболее употребимых операций, выполняемых над массивами, являетсясортировка.
Поэтому класс Array поддерживает множество методов сортировки элементов массива. Используя метод Sort ( ) , можно отсортировать весь массив, егочасть или два массива, которые содержат соответствующие пары "ключ/значение". Вотсортированном массиве можно организовать эффективный поиск заданных элементов с помощью метода BinarySearch (). Рассмотрим программу, в которой на основеint-массива показано использование методов Sort () и BinarySearch ():// Сортировка массива и поиск в нем заданного значения.using System;class SortDemo {public 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 б 3 14 9 8 17 1 24 -1 ОПорядок после сортировки: -1 0 1 3 4 5 б 8 9 14 17 24Индекс значения 14 равен 9524Часть II.
Библиотека С#В предыдущем примере массив имел базовый тип i n t , т.е. нессылочный тип. Всеметоды, определенные в классе Array, автоматически применимы для всех встроенных нессылочных типов. Но совсем иначе обстоит дело с массивами объектных ссылок. Чтобы выполнить сортировку или поиск значения в массиве объектных ссылок,тип класса этих объектов должен реализовать интерфейс IComparable. Если класс нереализует этот интерфейс, при попытке выполнить сортировку или поиск значения вмассиве будет динамически сгенерировано исключение.
К счастью, интерфейсIComparable реализовать нетрудно, поскольку он состоит только из одного метода:int CompareTo(object v)Этот метод сравнивает вызывающий объект со значением в параметре v. Он возвращает положительное число, если вызывающий объект больше значения v, нуль,если два сравниваемых объекта равны, и отрицательное число, если вызывающийобъект меньше значения v. Рассмотрим пример программы, которая иллюстрируетсортировку и поиск в массиве, состоящем из объектов класса, определенного пользователем://Сортировка и поиск в массиве объектов.using System;class MyClass : IComparable {public i n t i ;public MyClass(intx){ i = x;}/ / Реализуем интерфейс IComparable.public i n t CompareTo(object v) {return i - ((MyClass)v).i;c l a s s SortDemo {p u b l i c s t a t i c v o i d Main() {MyClass[] nums = new M y C l a s s [ 5 ] ;nums[0]nums[1]nums[2]nums[3]nums[4]=====newnewnewnewnewMyClass(5);MyClass(2);MyClass(3);MyClass ( 4 ) ;MyClass ( 1 ) ;/ / Отображаем исходный порядок следования элементов/ / в массиве.C o n s o l e .
W r i t e ( " И с х о д н ы й порядок:") ;f o r e a c h ( M y C l a s s о i n nums)Console.Write(о.i + " " ) ;Console.WriteLine();/ / Сортируем м а с с и в .Array.Sort(nums);/ / Отображаем отсортированный м а с с и в .C o n s o l e . W r i t e ( " П о р я д о к после сортировки: " ) ;f o r e a c h ( M y C l a s s o i n nums)Console.Write(о.i + " " ) ;Console.WriteLine();Глава 19. Пространство имен System,/525// Поиск объекта MyClass(2).MyClass x = new MyClass(2);int idx = Array.BinarySearch(nums, x ) ;Console.WriteLine("Индекс объекта MyClass(2) равенidx) ;Результаты выполнения этойИсходный порядок:Порядок после сортировки:Индекс объекта MyClass(2)(программы таковы:5 2 3 4 112 3 4 5равен 1Реверсирование массиваИногда полезно реверсировать содержимое массива.
Например, может потребоваться заменить массив, который был отсортирован в возрастающем порядке, массивом, отсортированном в убывающем порядке. Выполнить реверсирование нетрудно:достаточно вызвать метод Reverse О. С помощью этого метода можно реверсироватьвесь массив или только некоторую его часть. Этот процесс демонстрируется в следующей программе:// Реверсирование массива.u s i n g System;^class ReverseDemo {public static void Main() {int[] nums = { 1 , 2 , 3 , 4, 5 };// Отображаем исходный порядок.Console.Write("Исходный порядок:foreach(int i in nums)Console.Write(i + " " ) ;Console.WriteLine();" ) ;// Реверсируем весь массив.Array.Reverse(nums);// Отображаем обратный порядок.Console.Write("Обратный порядок:foreach(int i in nums)Console.Write(i + " " ) ;Console.WriteLine();" ) ;// Реверсируем часть массива.Array.Reverse(nums, 1, 3 ) ;// Отображаем порядок при частичном// реверсировании массива.Console.Write("После частичного реверсирования: " ) ;foreach(int i in nums)Console.Write(i + " " ) ;Console.WriteLine();526Часть II.
Библиотека С#Результаты выполнения этой программы таковы:Исходный порядок:12 3 4 5Обратный порядок:5 4 3 2 1После частичного реверсирования: 5 2 3 4 1Копирование массивовКопирование всего массива или некоторой его части — еще одна часто используемая операция. Чтобы скопировать массив, используйте метод Сору (). Этот метод может помещать элементы в начало массива-приемника или в середину, в зависимостиот того, какую версию метода Сору () вы используете. Использование метода Сору ()демонстрируется в следующей программе:// Копирование массива.using System;class CopyDemo {public static void Main() {int[] source = { 1 , 2, 3, 4, 5 } ;int[] target = { 11, 12, 13, 14, 15 };int[] source2 = { -1, -2, -3, -4, -5 };// Отображаем массив-источник копирования.Console.Write("Массив-источник: " ) ;foreach(int i in source)Console.Write(i + " ") ;Console.WriteLine() ;// Отображаем исходное содержимое массива-приемника.Console.Write("Исходное содержимое массива-приемника: " ) ;foreach(int i in target)Console.Write (i + " " ) ;Console.WriteLine();// Копируем весь массив.Array.Copy(source, target, source.Length);// Отображаем копию массива.Console.Write("Приемник после копирования: " ) ;foreach(int i in target)Console.Write (i + " " ) ;Console.WriteLine();// Копируем в середину массива target.Array.Copy(source2, 2, target, 3, 2 ) ;// Отображаем результат частичного копирования.Console.Write("Приемник после частичного копирования: " ) ;foreach(int i in target)Console.Write(i + " " ) ;Console.WriteLine();Глава 19.
Пространство имен System527Результаты выполнения этой программы таковы:Массив-источник: 1 2 3 4 5Исходное содержимое м а с с и в а - п р и е м н и к а : 11 12 13 14 15Приемник п о с л е к о п и р о в а н и я :1 2 3 45Приемник п о с л е ч а с т и ч н о г о к о п и р о в а н и я :1 2 3-3-4Таблица 19.11. Свойства, определенные в классе A r r a yСвойствоОписаниеpublic virtual boolIsFixedSize { get; }Предназначено только для чтения.
Принимает значение t r u e , еслимассив имеет фиксированный размер, и f a l s e , если массив может динамически его изменятьpublic virtual boolIsReadOnly { get; }Предназначено только для чтения. Принимает значение t r u e , еслиобъект класса A r r a y предназначен только для чтения, и f a l s e впротивном случаеpublic virtual boolIsSynchronized { get; }Предназначено только для чтения. Принимает значение t r u e , еслимассив можно безопасно использовать в многопоточной среде, иf a l s e в противном случаеpublic int Length { get;Предназначено только для чтения.
Содержит количество элементовв массивеpublic int Rank { get; }Предназначено только для чтения. Содержит размерность массиваpublic virtual objectSyncRoot { g e t ; }Предназначено только для чтения. Содержит объект, который должен быть использован для синхронизации доступа к массивуТаблица 19.12. Методы, определенные в классе A r r a yМетодОписаниеpublic static intBinarySearch(Array a,object v)В массиве, заданном параметром а, выполняет поиск значения, заданного параметром v.
Возвращает индекс первоговхождения искомого значения. Если оно не найдено, возвращает отрицательное число. Массив а должен быть отсортированным и одномернымpublic static intBinarySearch(Array a,object v,IComparer comp)В массиве, заданном параметром а, выполняет поиск значения, заданного параметром v, с использованием метода сравнения, заданного параметром сотр. Возвращает индекс первого вхождения искомого значения. Если оно не найдено, возвращает отрицательное число. Массив а должен бытьотсортированным и одномернымpublic static intBinarySearch(Array a,int start,int count,object v)В части массива, заданного параметром а, выполняет поискзначения, заданного параметром v. Поиск начинается с индекса,заданного параметром start,и охватывает count элементов.Возвращает индекс первого вхождения искомого значения.