Справочник от Автор24
Поделись лекцией за скидку на Автор24

Коллекции. Обобщенное программирование(Generics)

  • 👀 464 просмотра
  • 📌 418 загрузок
Выбери формат для чтения
Статья: Коллекции. Обобщенное программирование(Generics)
Найди решение своей задачи среди 1 000 000 ответов
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Коллекции. Обобщенное программирование(Generics)» pdf
Коллекции. Обобщенное программирование(Generics). 1)Коллекции на C# Типы коллекций. ArrayList — представляет из себя упорядоченную коллекцию объектов, доступ к которым можно получить, используя индекс, т.е. это аналог массива. Hashtable — Хеш таблицы SortedList — представляет из себя нечто среднее между ArrayList и Hashtable, обладая двумя сортируемыми массивами: ключей и значений. BitArray — представляет из себя вариант коллекции ArrayList для хранения значений битов. Queue — реализует структуру, называемую очередью. В этой структуре к элементам осуществляется доступ по принципу «первый пришел, первый ушел». Stack — реализует структуру, называемую стеком, В этой структуре к элементам осуществляется доступ по принципу «первый пришел, последним ушел». Необобщенные коллекции позволяют хранить элементы любого типа. Все переводятся в тип Object. ArrayList - аналог массива с переменной правой границей. ArrayList — представляет из себя упорядоченную коллекцию объектов, доступ к которым можно получить, используя индекс, т.е. это аналог массива. Hashtable — Хеш таблицы SortedList — представляет из себя нечто среднее между ArrayList и Hashtable, обладая двумя сортируемыми массивами: ключей и значений. BitArray — представляет из себя вариант коллекции ArrayList для хранения значений битов. Queue — реализует структуру, называемую очередью. В этой структуре к элементам осуществляется доступ по принципу «первый пришел, первый ушел». Stack — реализует структуру, называемую стеком, В этой структуре к элементам осуществляется доступ по принципу «первый пришел, последним ушел». Необобщенные коллекции позволяют хранить элементы любого типа. Все переводятся в тип Object. ArrayList - аналог массива с переменной правой границей. using System; using System.Collections; using System.Linq; using System.Text; namespace NongenericCollections // необобщенные коллекции { 1 class Program { static void Main(string[] args) { ArrayList one = new ArrayList(); // размер массива не указан тип не указан // ArrayList one = new ArrayList(10); // вариант сначала 10 элементов one.Add(1); // добавка элементов one.Add(3); one.Add(5); int m, i; m = one.Count; // количество элементов m=3 int Sum = 0; for (i = 0; i < one.Count; i++) { Sum = Sum + (int)one[i]; // не типизирован, требуется перевод из Object в int } } } } другие методы. one.Insert(1, 5); // перед первым элеметом коллекции one[1] = 7; // задание значения элементу коллекции one[2]="qwerty"; // задание элементу другого типа (string) m = (int)one[1]; // m=7 преобразование в int ! string s; s = (string)one[2]; m=one.IndexOf(7); // m=1 m=one.IndexOf("qwerty"); // m=2 one.RemoveAt(1); // 7 удалена one.Remove("qwerty"); // удалена qwerty one.Clear(); // очистка Сам объект one не удаляется! Пример коллекций с объектами базового и производного классов using System; using System.Collections; using System.Linq; using System.Text; namespace NongenericCollections // необобщенные коллекции { class Record { protected int min, sec; 2 public void Init(int m, int s) { min = m; sec = s; } public int Numbersec() { return min * 60 + sec; } }; class Sprint : Record { private int dec; public void Init(int m, int s,int d) { base.Init(m, s); dec = d; } public int Numbersec() // перегруженная функция { int k; k=min * 60 + sec; if (dec >= 5) k++; return k; } }; class Program { static void Main(string[] args) { ArrayList two = new ArrayList(); int a, b,c,i; Random x = new Random(); // x - случайное число for (i = 0; i < 10; i++) { a = x.Next(2); // x= 0 или 1 if (a == 0) { // генерация Record a = x.Next(3); // 0-2 min b = x.Next(60); // 0-59 sec Record p = new Record(); p.Init(a, b); two.Add(p); } else 3 { // генерация Sprint a = x.Next(3); // 0-2 min b = x.Next(60); // 0-59 sec c = x.Next(10); // 0-9 dec Sprint q = new Sprint(); q.Init(a, b, c); two.Add(q); } } string s; // определение сколько объектов Sprint в коллекции int KolS; KolS = 0; for (i = 0; i < 10; i++) { System.Type type = two[i].GetType(); // извлечение типа объекта s = type.Name; // имя типа if (s == "Sprint") KolS++; } } } } Сумма всех секунд в коллекции Numbersec перегружена class Record { protected int min, sec; public void Init(int m, int s) { min = m; sec = s; } virtual public int Numbersec() // функция виртуальная { return min * 60 + sec; } }; class Sprint : Record { private int dec; public void Init(int m, int s,int d) { base.Init(m, s); dec = d; } public override int Numbersec() 4 { int k; k=min * 60 + sec; if (dec >= 5) k++; return k; } }; ..... int Sum; Sum = 0; foreach (Record k in two) { Sum = Sum + k.Numbersec(); // сумма sec у 10 элементов коллекции } Numbersec - виртуальная - в зависимости от типа объекта высисление по базовому или производному классу. Если функция Numbersec не виртуальная, (virtual, override убраны), то в варианте: int Sum; Sum = 0; Record d; for (i = 0; i < two.Count; i++) { d = (Record)two[i]; // все Sprint --> Record Sum = Sum + d.Numbersec(); // вычисления по Record } вычисления только Numbersec по классу Record. Сортировка. Упорядочить объекты по значению Numbersec class Record: IComparable, IComparer // интерфейсы { protected int min, sec; public void Init(int m, int s) { min = m; sec = s; } 5 public int Numbersec() { return min * 60 + sec; } public int Compare(Object x0, Object y0) // сравнение 2 объектов { string s; int t1, t2; Record a; a = (Record)x0; t1 = a.Numbersec(); a = (Record)y0; t2 = a.Numbersec(); if (t1 < t2) return -1; else return 1; } public int CompareTo(Object x) { return Compare(this, x); } }; ........ IComparer Comp = new Record(); two.Sort(Comp); Вариант сортировки: вначале все Record, затем Sprint. Метод Display виртуальный. class Record: IComparable, IComparer { ......... virtual public void Display() { Console.Write(min); Console.Write(" "); Console.WriteLine(sec); } 6 ....... public int Compare(Object x0, Object y0) { string s; int t1, t2; System.Type type = x0.GetType(); s = type.Name; if (s == "Sprint") t1 = 1; else t1 = 0; type = y0.GetType(); s = type.Name; if (s == "Sprint") t2 = 1; else t2 = 0; if (t1 == 0 && t2 == 1) return -1; // если x0-Record, y0-Sprint только тогда меньше! else return 1; } ........ class Sprint : Record { ...... public override void Display() { Console.Write(min); Console.Write(" "); Console.Write(sec); Console.Write(" "); Console.WriteLine(dec); } ...... static void Main(string[] args) { ...... IComparer Comp = new Record(); two.Sort(Comp); foreach (Record k in two) { k.Display(); } 7 ..... на консоли: 10 значений до сортировки вперемешку 03 0 52 7 ..... 1 22 10 значений - сначала Record, потом Sprint 03 2 11 .... 1 22 0 52 7 ..... 1 22 8 2) Обобщенные коллекции на C#. Типы обобщенных коллекций: обобщенная List LinkedList Queue Stack Dictionary - аналог необобщенная - ArrayList - программно // Список! - Queue - Stack - Hashtable - шаблон для размещения реального типа. Обобщенная коллекция абстрактна для реальной коллекции требуется инициализация конкретным типом. В реализациях элементы конкретной коллекции могут быть одного типа. Пример. 2 реализации обобщенной коллекции List - коллекция Record и коллекция int. Вычисляется сумма количества секунд. using System; using System.Collections.Generic; 8 using System.Linq; using System.Text; namespace GenericCollections // обобщенные коллекции { class Record { private int min, sec; public void Init(int m, int s) { min = m; sec = s; } public int Numbersec() { return min * 60 + sec; } }; class Program { static void Main(string[] args) { List one = new List(); // коллекция из Record int a, b, i; Random x = new Random(); // случайное число for (i = 0; i < 10; i++) { a = x.Next(2); // случайное число 0-1 b = x.Next(60); // случайное число 0-59 Record z = new Record(); z.Init(a, b); // min, sec - случайные one.Add(z); // добавка в коллекцию } List two = new List(); // коллекция из целых чисел int m; foreach (Record k in one) { m = k.Numbersec(); two.Add(m); // заполнение коллекции из числа секунд объектов Record } int Sum = 0; foreach (int k in two) { Sum = Sum + k; // общее количество секунд у всех участников } } } 9 } Пример сортировки коллекции целых чисел с помощью компаратора. Расположить вначале четные числа в коллекции, затем нечетные. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace GenericCollections { public class IntComparer : IComparer // компаратор для целых чисел { public int Compare(int x, int y) // сравнение целых чисел { if (x % 2 == 0 && y % 2 == 1) // если слева четное, справа нет менять не нужно return -1; else return 1; } } class Program { static void Main(string[] args) { IntComparer ic = new IntComparer(); List two = new List(); two.Add(2); two.Add(7); two.Add(3); two.Add(6); two.Add(8); two.Add(1); two.Sort(ic); // сортировка по компаратору - 8 2 6 3 7 1 } } } 3) Обобщенные методы и классы (generics) на C# Пример. Обмен значений переменных (int float, char, объекты класса) a, b аналогично C++. 10 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Record { private int min, sec; public void Init(int m, int s) { min = m; sec = s; } } class Program { static void Change(ref T a, ref T b) // метод с параметром { T c; c = a; a = b; b = c; } static void Main(string[] args) { int a = 5, b = 3; double c = 6.0, d = 8.0; Change(ref a, ref b); // вызов с целыми аргументами Change(ref c, ref d); // вызов с вещественными аргументами Record x=new Record(); Record y=new Record(); x.Init(3, 5); y.Init(5, 3); Change(ref x, ref y); // с аргументами объектами Record } } } В проекте имеются класс Record и прозводный класс Sprint. Функция округления до минут представляет собой шаблон с ограничениями на параметры. using System; using System.Collections.Generic; using System.Linq; 11 using System.Text; namespace ConsoleApplication1 { class Record { private int min, sec; public Record(int m, int s) { min = m; sec = s; } public int Getmin() { return min; } public int Getsec() { return sec; } } class Sprint : Record { private int dec; public Sprint(int m, int s, int d) : base(m, s) { dec = d; } } class Program { static int Roundmin(T a) where T:Record // параметр T тип Record или производные классы { if (a.Getsec() >= 30) return a.Getmin() + 1; else return a.Getmin(); } static void Main(string[] args) { 12 Record r=new Record(3,40); Sprint s = new Sprint(5, 45, 50); int m,n; m = Roundmin(r); n = Roundmin(s); } } } Пример обобщенного класса массива общего типа на C# Аналог класса обобщенного массива для C++ создать не удается. Array содержит конструктор и метод суммы элементов. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Record { private int min, sec; public Record(int m, int s) { min = m; sec = s; } public int Getmin() { return min; } public int Getsec() { return sec; } public Record Add(Record a, Record b) // добавлен метод сложения двух объектов { Record c = new Record(0, 0); c.min = a.min + b.min; c.sec = a.sec + b.sec; if (c.sec >= 60) { c.min++; c.sec -= 60; 13 } return c; } } class Sprint : Record { private int dec; public Sprint(int m, int s, int d) : base(m, s) { dec = d; } } class Array where T:Record { private T[] ob; private int size; public Array(T[] o) { ob = o; } public T sum() { int i; T a; a = ob[0]; for (i = 1; i < ob.Length; i++) { a = (T)a.Add(a, ob[i]); } return a; } } static void Main(string[] args) { Record []rec=new Record[5]; int i; for(i=0;i<5;i++) { rec[i]=new Record(i,1); } Sprint[] sp = new Sprint[4]; 14 for (i = 0; i < 4; i++) { sp[i] = new Sprint(1, i,4); } Array X = new Array(rec); Array Y = new Array(sp); Record f=new Record(0,0); Record t=new Record(0,0); f=X.sum(); // s: min=10 sec=5 .... 15
«Коллекции. Обобщенное программирование(Generics)» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot