Коллекции. Обобщенное программирование(Generics)
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Коллекции. Обобщенное программирование(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