Architecture Net

Пример класса ArrayList (Список массивов)


Для начала приведем простой пример использования класса ArrayList (Список массивов) Как понятно из названия (Array List — Список массивов), ArrayList — это список объектов, хранимый подобно массиву Размер списка массивов может динамически изменяться, и может расти при добавлении новых элементов

Классы коллекций содержат экземпляры класса ОЬц ect (Объект) Мы создадим и будем иметь дело с коллекцией объектов Customer (Клиент) Использовать любой другой встроенный или определяемый пользователем управляемый тип ничуть не сложнее При использовании простого типа, такого, как int, экземпляр данного типа для сохранения в коллекции должен быть упакован (boxed), а перед его использованием — распакован обратно в int

Взятая для примера программа называется CustomerCollection В ней инициализируется список клиентов, после чего пользователь может просмотреть данный список, зарегистрировать нового клиента, отменить регистрацию клиента или изменить адрес его электронной почты Вызов простого метода help (помощь) отображает список доступных команд

Enter command, quit to exit
H> help
The following commands are available:
register register a customer
unregister unregister a customer
email change email address
show show customers
quit exit the program

Вот перевод:

Введите команду, quit для выхода из программы
Н> help
Доступны следующие команды:
register (регистрировать) регистрирует клиента
unregister (отменить регистрацию) отменяет регистрацию клиента


email (электронная почта) изменяет адрес электронной почты
show (показать) показывает клиентов
quit выход из программы

До того, как ознакомиться с исходным кодом, было бы неплохо запустить программу, зарегистрировать нового клиента, просмотреть список клиентов, изменить адрес электронной почты клиента, отменить регистрацию клиента и снова просмотреть список клиентов. Приведем пример выдачи программы:

Н> show // показать
id (-1 for all): -1 // идентификатор (-1 для всех):-1
1 Rocket Squirrel rocky@frosbitefalls.com
2 Bullwinkle Moose moose@wossamotta.edu
H> register // регистрировать
first name: Bob // имя: Боб
last name: Oberg // фамилия: Оберг
email address: oberg@objectinnovations.com // адрес электронной



// почты:
id = 3 // идентификатор = 3
H> email // электронная почта
customer id: 1 // идентификатор клиента
email address: rocky@objectinnovations.com // адрес электронной

// почты
Н> unregister
id: 2 // идентификатор: 2
Н> show // показать
id (-1 for all): -1 // идентификатор (-1 для всех)
1 Rocket Squirrel rocky@objectinnovations.com
3 Bob Oberg oberg@objectinnovations.com
Класс Customer (Клиент)


Все файлы с исходными кодами программы-примера находятся в папке Customer-Collection. В файле customer. h находится реализация классов Customer (Клиент) и Customers (Клиенты). Исходный код для класса Customer (Клиент) почти такой же, как приведенный ранее. Единственное добавление — специальный конструктор, инициализирующий объект Customer (Клиент) заданным идентификатором. Этот конструктор используется классом Customers (Клиенты) при удалении элемента (UnregisterCustomer) и при проверке того, присутствует ли в коллекции некоторый элемент (Checkld).
_gc class Customer
// сборщик мусора - класс Клиент
{
pmblic:
Customer(int id) // Клиент (int-идентификатор)
{
nCustomerld = id; // идентификатор
pFirstName = "";
pLastName = "";
pEmailAddress = "";
}
};
Класс Customers (Клиенты) содержит список клиентов, хранимый в ArrayList
{Список массивов).
_gc class Customers // сборщик мусора - класс Клиенты
{
private: // частный
ArrayList *pCustomers;
public:
Customers() // Клиенты
{
pCustomers = new ArrayList;
RegisterCustomer(
"Rocket", // Ракета "Squirrel",
// Белка "rocky@frosbitefalls.com");
RegisterCustomer( "Bullwinkle",
"Moose", // Американский лось "moose@wossamotta.edu");

}
int RegisterCustomer( String *pFirstName, String *pLastName, String *pEmailAddress)
{
Customer *pCust = new Customer( // Клиент
*pCust = новый Клиент
{
pFirstName, pLastName, pEmailAddress); pCustomers->Add(pCust); // Добавить return pCust->nCustomer!d; }
void UnregisterCustomer(int id) // идентификатор {
Customer *pCust = new Customer(id);
// Клиент *pCust = новый Клиент (идентификатор);
pCustomers->Remove(pCust);
}
void ChangeEmailAddress(int id, String *pEmailAddress)
// (int идентификатор, Строка *pEmailAddress)
{
lEnumerator *pEnum =
pCustomers-XSetEntimerator () ;
while (pEnum->MoveNext())
{
Customer *pCust = // Клиент
dynamic_cast<Customer *>(pEnum->Current); // Клиент
if (pCust->nCustomer!d == id)
// если (pCust-> nCustomerld == идентификатор)
{
pCust->pEmailAddress = pEmailAddress;
return;
}
}
String *pStr = String::Format( // Формат
"id {0} {!}", _box(id), S"not found");



// "идентификатор {0} {!}", (идентификатор),
// " не найден");
throw new Exception(pStr); // новое Исключение
}
void ShowCustomers(int id) // идентификатор
{
if ('Checkld(id) && id '= -1)
// если (! Checkld (идентификатор) && идентификатор! =-1)
return; lEnumerator *pEnum =
pCustomers-XSetEnumerator();
while (pEnum->MoveNext())
{
Customer *pCust = // Клиент
dynamic_cast<Customer *>(pEnum->Current); // Клиент

if (id == -1 || id == pCust->nCustomer!d)
// если (идентификатор == -1 ||
// идентификатор == pCust-> nCustomerld)
{
String *pSid =
pCust->nCustomerId.ToStnng() ->PadLeft (4) ;
String *pFirst =
pCust->pFirstName->PadRight(12) ;
String *pLast =
pCust->pLastName->PadRight(12);
String *pEmail =
pCust->pEmailAddress->PadRight(20) ;
Console::Write("{0} ", pSid); // Пульт:: Записать
Console::Write("{0} ", pFirst); // Пульт:: Записать

Console::Write("{0} ", pLast) ; // Пульт:: Записать

Console::WriteLine("{0}", pEmail); // Пульт:: Записать

}
}
}
bool Checkld(int id)
// логический{булев} Checkld (int идентификатор)
{
Customer *pCust = new Customer(id);
// Клиент *pCust = новый Клиент (идентификатор);
return pCustomers->Contains(pCust); // Содержит ?
}
};
Жирным шрифтом в листинге выделены строки, в которых используются особенности класса коллекции. Для перемещения по коллекции используется интерфейс lEnumerator. Он может быть использован в данном случае, так как ArrayList (Список массивов) поддерживает интерфейс lEnumerable. Этот интерфейс обеспечивает поддержку особой семантики С# — семантики foreach. Ключевое слово foreach не поддерживается в C++. Однако из приведенного примера видно, что в управляемом C++ для перебора элементов ArrayList (Список массивов) можно применять интерфейс lEnumerable. Интерфейсы, предназначенные для работы с коллекциями, включая lenumerable, будут рассмотрены в этой главе позже.

Методы Add (Добавить) и Remove (Удалить), как и следует предположить по их названиям, используются для добавления и удаления элементов коллекции, соответственно. Метод Remove (Удалить) просматривает коллекцию в поисках элемента, равного элементу, переданному методу в качестве аргумента, и удаляет найденный элемент. Равенство элементов устанавливается вызовом метода Equals (Равняется). Методу Remove (Удалить) в качестве аргумента передается элемент, создаваемый реализованным нами специальным конструктором, причем для создания элемента используется идентификатор. Поскольку мы подменили метод Equals (Равняется) так, что равенство элементов устанавливается только по атрибуту CustomerlD, этот конструктор имеет единственный аргумент — идентификатор клиента.
Метод Contains (Содержит), применяемый нами во вспомогательном методе Checkld, использует подмененный метод Equals (Равняется) аналогичным образом.
Благодаря использованию коллекций облегчается добавление и удаление элементов. При использовании с той же целью массивов вместо коллекций требуется написать немало кода, необходимого для вставки и перемещения элементов массива, а также для заполнения пустого места, остающегося после удаления элемента. Кроме того, коллекции не имеют определенного размера, и при необходимости могут быть динамически увеличены.
CompEbook.ru Железо, дизайн, обучение и другие

Содержание раздела