Динамические структуры и классы в С# (на основе коллекций)
В C# коллекция представляет собой совокупность объектов. В среде.NET Framework имеется немало интерфейсов и классов, в которых определяются и реализуются различные типы коллекций. Коллекции упрощают решение многих задач программирования благодаря тому, что предлагают готовые решения для создания целого ряда типичных, но порой трудоемких для разработки структур данных. Например, в среду.NET Framework встроены коллекции, предназначенные для поддержки динамических массивов, связных списков, стеков, очередей и хеш-таблиц.
Главное преимущество коллекций заключается в том, что они стандартизируют обработку групп объектов в программе. Все коллекции разработаны на основе набора четко определенных интерфейсов. Некоторые встроенные реализации таких интерфейсов, в том числе ArrayList, Hashtable, Stack и Queue, могут применяться в исходном виде и без каких-либо изменений.
Основополагающим для всех коллекций является понятие перечислителя, который поддерживается в необобщенных интерфейсах IEnumerator и IEnumerable, а также в обобщенных интерфейсах IEnumerator<T> и IEnumerable<T>. Перечислитель обеспечивает стандартный способ поочередного доступа к элементам коллекции. Следовательно, он перечисляет содержимое коллекции. В каждой коллекции должна быть реализована обобщенная или необобщенная форма интерфейса IEnumerable, поэтому элементы любого класса коллекции должны быть доступны посредством методов, определенных в интерфейсе IEnumerator или IEnumerator<T>. Это означает, что, внеся минимальные изменения в код циклического обращения к коллекции одного типа, его можно использовать для аналогичного обращения к коллекции другого типа. Любопытно, что для поочередного обращения к содержимому коллекции в цикле foreach используется перечислитель.
|
С перечислителем непосредственно связано другое средство, называемое итератором. Это средство упрощает процесс создания классов коллекций, например специальных, поочередное обращение к которым организуется в цикле foreach.
Интерфейсы, используемые в коллекциях C#
Интерфейс | Описание |
IEnumerable<T> | Интерфейс IEnumerable необходим, когда с коллекцией используется оператор foreach. Этот интерфейс определяет метод GetEnumerator(), возвращающий перечислитель, который реализует IEnumerator. |
ICollection<T> | ICollection<T> — это интерфейс, реализованный классами обобщенных коллекций. С его помощью можно получить количество элементов в коллекции (свойство Count) и скопировать коллекцию в массив (метод СоруТо()). Можно также добавлять и удалять элементы из коллекции (Add(), Remove(), Clear()). |
IList<T> | Интерфейс IList<T> предназначен для создания списков, элементы которых доступны по своим позициям. Этот интерфейс определяет индексатор, а также способы вставки и удаления элементов в определенные позиции (методы Insert() и Remove()). IList<T> унаследован от ICollection<T>. |
ISet<T> | Интерфейс ISet<T> появился в версии.NET 4. Этот интерфейс реализуется множествами. Он позволяет комбинировать различные множества в объединения, а также проверять, не пересекаются ли два множества. ISet<T> унаследован от ICollection<T>. |
IDictionary<TKey, TValue> | Интерфейс IDictionary<TKey, TValue> реализуется обобщенными классами коллекций, элементы которых состоят из ключа и значения. С помощью этого интерфейса можно получать доступ ко всем ключам и значениям, извлекать элементы по индексатору типа ключа, а также добавлять и удалять элементы. |
ILookup<TKey, TValue> | Подобно IDictionary<TKey, TValue> поддерживает ключи и значения. Однако в этом случае коллекция может содержать множественные значения для одного ключа. |
IComparer<T> | Интерфейс IComparer<T> реализован компаратором и используется для сортировки элементов внутри коллекции с помощью метода Compare(). |
IEqualityComparer<T> | Интерфейс IEqualityComparer<T> реализован компаратором, который может быть применен к ключам словаря. Через этот интерфейс объекты могут быть проверены на предмет эквивалентности друг другу. В.NET 4 этот интерфейс также реализован массивами и кортежами. |
|
Необобщенные коллекции представляют собой структуры данных общего назначения, оперирующие ссылками на объекты. Таким образом, они позволяют манипулировать объектом любого типа, хотя и не типизированным способом. В этом состоит их преимущество и в то же время недостаток. Благодаря тому что необобщенные коллекции оперируют ссылками на объекты, в них можно хранить разнотипные данные. Это удобно в тех случаях, когда требуется манипулировать совокупностью разнотипных объектов или же когда типы хранящихся в коллекции объектов заранее неизвестны.
В пространстве имен System.Collections определен целый ряд интерфейсов необобщенных коллекций. Начинать рассмотрение необобщенных коллекций следует именно с интерфейсов, поскольку они определяют функциональные возможности, которые являются общими для всех классов необобщенных коллекций. Интерфейсы, служащие опорой для необобщенных коллекций, сведены в следующей таблице:
|
Интерфейсы, используемые в необобщенных коллекциях
Интерфейс | Описание |
ICollection | Определяет элементы, которые должны иметь все необобщенные коллекции |
IComparer | Определяет метод Compare() для сравнения объектов, хранящихся в коллекции |
IDictionary | Определяет коллекцию, состоящую из пар "ключ-значение" |
IDictionaryEnumerator | Определяет перечислитель для коллекции, реализующей интерфейс IDictionary |
IEnumerable | Определяет метод GetEnumerator(), предоставляющий перечислитель для любого класса коллекции |
IEnumerator | Предоставляет методы, позволяющие получать содержимое коллекции по очереди |
IEqualityComparer | Сравнивает два объекта на предмет равенства |
IHashCodeProvider | Считается устаревшим. Вместо него следует использовать интерфейс IEqualityComparer |
IList | Определяет коллекцию, доступ к которой можно получить с помощью индексатора |
IStructuralComparable | Определяет метод CompareTo(), применяемый для структурного сравнения |
IStructuralEquatable | Определяет метод Equals(), применяемый для выяснения структурного, а не ссылочного равенства. Кроме того, определяет метод GetHashCode() |
Структура DictionaryEntry
В пространстве имен System.Collections определена структура DictionaryEntry. Необобщенные коллекции пар "ключ-значение" сохраняют эти пары в объекте типа DictionaryEntry. В данной структуре определяются два следующих свойства:
public object Key { get; set; }
public object Value { get; set; }
Эти свойства служат для доступа к ключу или значению, связанному с элементом коллекции. Объект типа DictionaryEntry может быть сконструирован с помощью конструктора:
public DictionaryEntry(object key, object value)
где key обозначает ключ, a value — значение.
Классы необобщенных коллекций
ArrayList | Определяет динамический массив, т.е. такой массив, который может при необходимости увеличивать свой размер. |
Hashtable | Определяет хеш-таблицу для пар "ключ-значение" (реестр/журналы) |
Queue | Определяет очередь, или список, действующий по принципу "первым пришел — первым обслужен" |
SortedList | Определяет отсортированный список пар "ключ-значение" |
Stack | Определяет стек, или список, действующий по принципу "первым пришел — последним обслужен" |
Классы обобщенных коллекций
Kлассы обобщенных коллекций по большей части соответствуют своим необобщенным аналогам, хотя в некоторых случаях они носят другие имена. Отличаются они также своей организацией и функциональными возможностями. Классы обобщенных коллекций определяются в пространстве имен System.Collections.Generic:
Dictionary<Tkey, TValue> | Сохраняет пары "ключ-значение". Обеспечивает такие же функциональные возможности, как и необобщенный класс Hashtable |
HashSet<T> | Сохраняет ряд уникальных значений, используя хештаблицу |
LinkedList<T> | Сохраняет элементы в двунаправленном списке |
List<T> | Создает динамический массив. Обеспечивает такие же функциональные возможности, как и необобщенный класс ArrayList |
Queue<T> | Создает очередь. Обеспечивает такие же функциональные возможности, как и необобщенный класс Queue |
SortedDictionary<TKey, TValue> | Создает отсортированный список из пар "ключ-значение" |
SortedList<TKey, TValue> | Создает отсортированный список из пар "ключ-значение". Обеспечивает такие же функциональные возможности, как и необобщенный класс SortedList |
SortedSet<T> | Создает отсортированное множество |
Stack<T> | Создает стек. Обеспечивает такие же функциональные возможности, как и необобщенный класс Stack |
Динамические массивы:
В классе ArrayList поддерживаются динамические массивы, расширяющиеся и сокращающиеся по мере необходимости. В языке C# стандартные массивы имеют фиксированную длину, которая не может изменяться во время выполнения программы. Это означает, что количество элементов в массиве нужно знать заранее. Но иногда требуемая конкретная длина массива остается неизвестной до самого момента выполнения программы. Именно для таких ситуаций и предназначен класс ArrayList. В классе ArrayList определяется массив переменной длины, который состоит из ссылок на объекты и может динамически увеличивать и уменьшать свой размер.
Массив типа ArrayList создается с первоначальным размером. Если этот размер превышается, то массив автоматически расширяется. А при удалении объектов из такого массива он автоматически сокращается. Коллекции класса ArrayList широко применяются в практике программирования на C#. Многие способы применения коллекций класса ArrayList распространяются и на другие коллекции, в том числе и на обобщенные. В классе ArrayList реализуются интерфейсы ICollection, IList, IEnumerable и ICloneable. Ниже приведены конструкторы класса ArrayList:
public ArrayList()
public ArrayList(ICollection с)
public ArrayList(int capacity)
Первый конструктор создает пустую коллекцию класса ArrayList с нулевой первоначальной емкостью. Второй конструктор создает коллекцию типа ArrayList с количеством инициализируемых элементов, которое определяется параметром c и равно первоначальной емкости массива. Третий конструктор создает коллекцию, имеющую указанную первоначальную емкость, определяемую параметром capacity. В данном случае емкость обозначает размер базового массива, используемого для хранения элементов коллекции. Емкость коллекции типа ArrayList может увеличиваться автоматически по мере добавления в нее элементов.
В классе ArrayList определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Коллекцию класса ArrayList можно отсортировать, вызвав метод Sort(). В этом случае поиск в отсортированной коллекции с помощью метода BinarySearch() становится еще более эффективным. Содержимое коллекции типа ArrayList можно также обратить, вызвав метод Reverse(). Некоторые из наиболее часто используемых методов класса ArrayList перечислены ниже:
AddRange()
Добавляет элементы из коллекции в конец вызывающей коллекции типа ArrayList
BinarySearch()
Выполняет поиск в вызывающей коллекции значения. Возвращает индекс найденного элемента. Если искомое значение не найдено, возвращает отрицательное значение. Вызывающий список должен быть отсортирован
СоруТо()
Копирует содержимое вызывающей коллекции в массив, который должен быть одномерным и совместимым по типу с элементами коллекции
FixedSize()
Заключает коллекцию в оболочку типа ArrayList с фиксированным размером и возвращает результат. Возвращает часть вызывающей коллекции типа ArrayList. Часть возвращаемой коллекции начинается с элемента, указываемого по индексу, и включает количество элементов, определяемое параметром count. Возвращаемый объект ссылается на те же элементы, что и вызывающий объект.
IndexOf()
Возвращает индекс первого вхождения объекта в вызывающей коллекции. Если искомый объект не обнаружен, возвращает значение -1
InsertRange()
Вставляет элементы коллекции в вызывающую коллекцию, начиная с элемента, указываемого по индексу
Readonly()
Заключает коллекцию в оболочку типа ArrayList, доступную только для чтения, и возвращает результат
RemoveRange()
Удаляет часть вызывающей коллекции, начиная с элемента, указываемого по индексу index, и включая количество элементов, определяемое параметром count
Sort()
Сортирует вызывающую коллекцию по нарастающей
В классе ArrayList поддерживается также ряд методов, оперирующих элементами коллекции в заданных пределах. Так, в одну коллекцию типа ArrayList можно вставить другую коллекцию, вызвав метод InsertRange(). Для удаления из коллекции элементов в заданных пределах достаточно вызвать метод RemoveRange(). А для перезаписи элементов коллекции типа ArrayList в заданных пределах элементами из другой коллекции служит метод SetRange(). И наконец, элементы коллекции можно сортировать или искать в заданных пределах, а не во всей коллекции.
По умолчанию коллекция типа ArrayList не синхронизирована. Для получения синхронизированной оболочки, в которую заключается коллекция, вызывается метод Synchronized().
В классе ArrayList имеется также приведенное ниже свойство Capacity, помимо свойств, определенных в интерфейсах, которые в нем реализуются:
public virtual int Capacity { get; set; }
Свойство Capacity позволяет получать и устанавливать емкость вызывающей коллекции типа ArrayList. Емкость обозначает количество элементов, которые может содержать коллекция типа ArrayList до ее вынужденного расширения. Как упоминалось выше, коллекция типа ArrayList расширяется автоматически, и поэтому задавать ее емкость вручную необязательно. Но из соображений эффективности это иногда можно сделать, если количество элементов коллекции известно заранее. Благодаря этому исключаются издержки на выделение дополнительной памяти.
С другой стороны, если требуется сократить размер базового массива коллекции типа ArrayList, то для этой цели достаточно установить меньшее значение свойства Capacity. Но это значение не должно быть меньше значения свойства Count. Напомним, что свойство Count определено в интерфейсе ICollection и содержит количество объектов, хранящихся в коллекции на данный момент. Всякая попытка установить значение свойства Capacity меньше значения свойства Count приводит к генерированию исключения ArgumentOutOfRangeException. Поэтому для получения такого количества элементов коллекции типа ArrayList, которое содержится в ней на данный момент, следует установить значение свойства Capacity равным значению свойства Count. Для этой цели можно также вызвать метод TrimToSize().
Давайте рассмотрим пример использования некоторых методов класса ArrayList:
using System;
using System.Collections;
namespace ConsoleApplication1
{
class MyCollection
{
public static ArrayList NewCollection(int i)
{
Random ran = new Random();
ArrayList arr = new ArrayList();
for (int j = 0; j < i; j++)
arr.Add(ran.Next(1, 50));
return arr;
}
public static void RemoveElementMyCollection(int i, int j, ref ArrayList arr)
{
arr.RemoveRange(i, j);
}
public static void AddElementInMyCollection(int i, ref ArrayList arr)
{
Random ran = new Random();
for (int j = 0; j < i; j++)
arr.Add(ran.Next(1, 50));
}
public static void WriteMyCollection(ArrayList arr)
{
foreach (int a in arr)
Console.Write("{0}\t", a);
Console.WriteLine("\n");
}
}
class Program
{
static void Main()
{
// Создадим новую коллекцию чисел длиной 8
ArrayList Coll = MyCollection.NewCollection(8);
Console.WriteLine("Исходная коллекция чисел: ");
MyCollection.WriteMyCollection(Coll);
// Удалим пару элементов
MyCollection.RemoveElementMyCollection(5, 2, ref Coll);
Console.WriteLine("Коллекция после удаления предпоследних двух элементов: ");
MyCollection.WriteMyCollection(Coll);
// Добавим еще несколько элементов
MyCollection.AddElementInMyCollection(10, ref Coll);
Console.WriteLine("Добавили 10 элементов: ");
MyCollection.WriteMyCollection(Coll);
// Отсортируем теперь коллекцию
Coll.Sort();
Console.WriteLine("Отсортированная коллекция: ");
MyCollection.WriteMyCollection(Coll);
Console.ReadLine();
}
}
}
Связный список
Преимущество связного списка проявляется в том, что операция вставки элемента в середину выполняется очень быстро. При этом только ссылки Next (следующий) предыдущего элемента и Previous (предыдущий) следующего элемента должны быть изменены так, чтобы указывать на вставляемый элемент. В классе List<T> при вставке нового элемента все последующие должны быть сдвинуты.
Естественно, у связных списков есть и свои недостатки. Так, например, все элементы связных списков доступны лишь друг за другом. Поэтому для нахождения элемента, находящегося в середине или конце списка, требуется довольно много времени. Связный список не может просто хранить элементы внутри себя. Вместе с каждым из них ему необходимо иметь информацию о следующем и предыдущем элементах. Вот почему LinkedList<T> содержит элементы типа LinkedListNode<T>. С помощью класса LinkedListNode<T> появляется возможность обратиться к предыдущему и последующему элементам списка. Класс LinkedListNode<T> определяет свойства List, Next, Previous и Value. Свойство List возвращает объект LinkedList<T>, ассоциированный с узлом. Свойства Next и Previous предназначены для итераций по списку и для доступа к следующему и предыдущему элементам. Свойство Value типа T возвращает элемент, ассоциированный с узлом.
Сам класс LinkedList<T> определяет члены для доступа к первому (First) и последнему (Last) элементам в списке, для вставки элементов в определенные позиции (AddAfter(), AddBefore(), AddFirst(), AddLast()), для удаления элементов из заданных позиций (Remove(), RemoveFirst(), RemoveLast()) и для нахождения элементов, начиная поиск либо с начала (Find()), либо с конца (FindLast()) списка.
В классе LinkedList<T> реализуются интерфейсы ICollection, ICollection<T>, IEnumerable, IEnumerable<T>, ISerializable и IDeserializationCallback. В двух последних интерфейсах поддерживается сериализация списка. В классе LinkedList<T> определяются два приведенных ниже открытых конструктора:
public LinkedList()
public LinkedList(IEnumerable<T> collection)
В первом конструкторе создается пустой связный список, а во втором конструкторе — список, инициализируемый элементами из коллекции collection.
В классе LinkedList<T> определяется немало методов. Наиболее часто используемые методы, определенные в классе LinkedList<T> представлены ниже:
AddAfter()
Добавляет в список узел со значением непосредственно после указанного узла. Указываемый узел не должен быть пустым (null). Метод возвращает ссылку на узел, содержащий значение.
AddBefore()
Добавляет в список узел со значением value непосредственно перед указанным узлом. Указываемый узел не должен быть пустым (null). Метод возвращает ссылку на узел, содержащий значение.
AddFirst(), AddLast()
Добавляют узел со значением в начало или в конец списка.
Find()
Возвращает ссылку на первый узел в списке, имеющий передаваемое значение. Если искомое значение отсутствует в списке, то возвращается пустое значение.
Remove()
Удаляет из списка первый узел, содержащий передаваемое значение. Возвращает логическое значение true, если узел удален, т.е. если узел со значением обнаружен в списке и удален; в противном случае возвращает логическое значение false.
Давайте рассмотрим пример использования связных списков:
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
// Создадим связный список
LinkedList<string> link = new LinkedList<string>();
// Добавим несколько элементов
link.AddFirst("sp");
link.AddFirst("pp");
link.AddFirst("bd");
link.AddFirst("iss");
// Отобразим элементы в прямом направлении
LinkedListNode<string> node;
Console.WriteLine("Элементы коллекции в прямом направлении: ");
for (node = link.First; node!= null; node = node.Next)
Console.Write(node.Value + "\t");
// Отобразить элементы в обратном направлении
Console.WriteLine("\n\nЭлементы коллекции в обратном направлении: ");
for (node = link.Last; node!= null; node = node.Previous)
Console.Write(node.Value + "\t");
Console.ReadLine();
}
}
}
Если нужна коллекция, отсортированная по ключу, можно воспользоваться SortedList<TKey, TValue> Этот класс сортирует элементы на основе значения ключа. Можно использовать не только любой тип значения, но также и любой тип ключа.
В классе SortedList<TKey, TValue> реализуются интерфейсы IDictionary, IDictionary<TKey, TValue>, ICollection, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable и IEnumerable<KeyValuePair<TKey, TValue>. Размер коллекции типа SortedList<TKey, TValue> изменяется динамически, автоматически увеличиваясь по мере необходимости. Класс SortedList<TKey, TValue> подобен классу SortedDictionary<TKey, TValue>, но у него другие рабочие характеристики. В частности, класс SortedList<TKey, TValue> использует меньше памяти, тогда как класс SortedDictionary<TKey, TValue> позволяет быстрее вставлять неупорядоченные элементы в коллекцию.
В классе SortedList<TKey, TValue> предоставляется немало конструкторов. Ниже перечислены наиболее часто используемые конструкторы этого класса:
public SortedList()
public SortedList(IDictionary<TKey, TValue> dictionary)
public SortedList(int capacity)
public SortedList(IComparer<TK> comparer)
В первой форме конструктора создается пустой список с выбираемой по умолчанию первоначальной емкостью. Во второй форме конструктора создается отсортированный список с указанным количеством элементов dictionary. В третьей форме конструктора с помощью параметра capacity задается емкость коллекции, создаваемой в виде отсортированного списка. Если размер списка заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера списка во время выполнения, что, как правило, требует дополнительных затрат вычислительных ресурсов. И в четвертой форме конструктора допускается указывать с помощью параметра comparer способ сравнения объектов, содержащихся в списке.
Емкость коллекции типа SortedList<TKey, TValue> увеличивается автоматически по мере необходимости, когда в список добавляются новые элементы. Если текущая емкость коллекции превышается, то она увеличивается. Преимущество указания емкости коллекции типа SortedList<TKey, TValue> при ее создании заключается в снижении или полном исключении издержек на изменение размера коллекции. Разумеется, указывать емкость коллекции целесообразно лишь в том случае, если заранее известно, сколько элементов требуется хранить в ней.
В классе SortedList<TKey, TValue> определяется ряд собственных методов, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Некоторые из наиболее часто используемых методов этого класса перечислены ниже:
Add()
Добавляет в список пару "ключ-значение". Если ключ уже находится в списке, то его значение не изменяется, и генерируется исключение ArgumentException
ContainsKey()
Возвращает логическое значение true, если вызывающий список содержит объект key в качестве ключа; а иначе — логическое значение false
ContainsValue()
Возвращает логическое значение true, если вызывающий список содержит значение value; в противном случае — логическое значение false
GetEnumerator()
Возвращает перечислитель для вызывающего словаря
IndexOfKey(), IndexOfValue()
Возвращает индекс ключа или первого вхождения значения в вызывающем списке. Если искомый ключ или значение не обнаружены в списке, возвращается значение -1.
Remove()
Удаляет из списка пару "ключ-значение" по указанному ключу key. При удачном исходе операции возвращается логическое значение true, а если ключ key отсутствует в списке — логическое значение false.
TrimExcess()
Сокращает избыточную емкость вызывающей коллекции в виде отсортированного списка.
Кроме того, в классе SortedList<TK, TV> определяются собственные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Эти свойства приведены ниже:
Capacity
Получает или устанавливает емкость вызывающей коллекции в виде отсортированного списка
Comparer
Получает метод сравнения для вызывающего списка
Keys
Получает коллекцию ключей
Values
Получает коллекцию значений
И наконец, в классе SortedList<TKey, TValue> реализуется приведенный ниже индексатор, определенный в интерфейсе IDictionary<TKey, TValue>
public TValue this[TKey key] { get; set; }
Этот индексатор служит для получения и установки значения элемента коллекции, а также для добавления в коллекцию нового элемента. Но в данном случае в качестве индекса служит ключ элемента, а не сам индекс. Давайте рассмотрим пример использования сортированного списка:
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
// Создадим коллекцию сортированного списка
SortedList<string, string> SessiaInfo = new SortedList<string, string>();
// Добавим несколько элементов в коллекцию
SessiaInfo.Add("SP", "2345");
SessiaInfo.Add("PP", "2345");
SessiaInfo.Add("Saity", "2345");
SessiaInfo.Add("BD", "2345");
SessiaInfo.Add("ISS", "2345");
SessiaInfo.Add("ISRPO", "2345");
// Коллекция ключей
ICollection<string> keys = SessiaInfo.Keys;
// Теперь используем ключи, для получения значений
foreach (string s in keys)
Console.WriteLine("Sessia: {0}, Marks: {1}", s, SessiaInfo[s]);
Console.ReadLine();
}
}
}
Варианты динамические массивы:
№ варианта | Одномерный массив |
1/14 | Вывести индекс первого четного элемента массива. Вывести массив. Удалить часть массива начиная с первого четного. Отсортировать оставшийся массив по возрастанию. |
2/15 | Вывести индекс первого отрицательного элемента массива. Вывести массив. Удалить часть массива начиная с первого отрицательного. Отсортировать оставшийся массив по убыванию. |
3/16 | Вывести индекс первого элемента массива с заданным значением (например, 10). Вывести массив. Удалить часть массива начиная с заданного. Отсортировать оставшийся массив по возрастанию. |
4/17 | Вывести индекс нулевого элемента массива (=0). Вывести массив. Удалить часть массива начиная с нуля. Отсортировать оставшийся массив по убыванию. |
5/18 | Вывести индекс k-го элемента массива. Вывести массив. Удалить часть массива начиная с k. Отсортировать оставшийся массив по возрастанию. |
6/19 | Добавить К элементов в начало массива. Вывести массив. Отсортировать массив по возрастанию. Удалить часть массива начиная с заданного индекса. |
7/20 | Добавить К элементов в конец массива. Вывести массив. Удалить все четные элементы. Отсортировать массив по убыванию. |
8/21 | Добавить К элементов в начало массива. Вывести массив. Отсортировать массив по возрастанию. Удалить отрицательные элементы массива. |
9/22 | Добавить К элементов в конец массива. Вывести массив. Удалить все нулевые элементы. Отсортировать массив по убыванию. |
10/23 | Удалить К элементов из начала массива и добавить M элементов в конец массива. Вывести массив. Отсортировать массив по возрастанию. Удалить часть массива начиная с заданного индекса. |
11/24 | Удалить К элементов из начала массива и добавить M элементов в конец массива. Вывести массив. Удалить все нечетные элементы. Отсортировать массив по убыванию. |
12/25 | Удалить К элементов из начала массива и добавить M элементов в конец массива. Вывести массив. Отсортировать массив по возрастанию. Удалить положительные элементы массива. |
13/26 | Добавить К элементов в конец массива. Вывести массив. Отсортировать массив по убыванию. Удалить четные элементы массива. |
Варианты списки
1/14 | Сформировать список песен и исполнителей. Добавить новую песню после k-й. Найти определенного исполнителя и удалить его. |
2/15 | Сформировать список продуктов и цен на них. Удалить последний продукт. Найти продукты с ценами >1000р. |
3/16 | Сформировать список студентов и их возраста. Добавить нового студента перед k-м. Найти студентов с возрастом 17 лет и удалить их из списка. |
4/17 | Сформировать список продуктов и их количества в магазине. Удалить первый продукт. Найти продукты с количеством <10. |
5/18 | Сформировать список предметов по ЕГЭ и баллов к ним у абитуриента. Добавить новый предмет в конец списка. Найти предмет со 100 баллами. |
6/19 | Сформировать список предметов и часов специальности. Удалить предмет перед указанным (например, СП). Найти количество часов по БД. |
7/20 | Сформировать список компьютерной техники и фирм производителей. Добавить новый элемент перед k-м. Удалить первый элемент списка. Найти продукты фирмы Intel. |
8/21 | Сформировать список групп учащихся и количества студентов в них в колледже. Добавить новую группу в конец списка. Удалить группу после заданного элемента списка. Найти группу из 24 студентов. |
9/22 | Сформировать писок музыкальных групп и количества выпущенных альбомов. Добавить неизвестный альбом в начало списка. Найти группу RHCP. Удалить последнюю группу в списке. |
10/23 | Сформировать список авто и цен в магазине. Добавить элемент списка после указанного K-го. Найти машины марки Mitsubishi. Удалить первый элемент списка. |
11/24 | Сформировать список вкладчиков банка и размеров вкладов. Добавить нового вкладчика в конец списка. Найти вкладчика с вкладом >1000000р. Удалить первый элемент списка. |
12/25 | Сформировать список фильмов и сумм кассовых сборов. Добавить новый фильм в начало. Найти фильм «Властелин колец». Удалить k-й фильм в списке. |
13/26 | Сформировать список услуг и их цены некоторой организации. Добавить новую услугу перед k-й. Найти услуги с минимальной ценой и удалить их из списка. |
Сохранить код проекта в папке класса под именем DinCollection1
Откомпилировать проект
Предъявить проект для проверки