Ада 05 вопрос: Поиск конкретных элементов в векторе записей? - PullRequest
2 голосов
/ 15 мая 2011

Я создал программу Ada, которая будет скомпилирована в GNAT Gcc compiler 4.3.0 Я создал запись, которая состоит из имени, телефона, адреса и дня рождения. Имя, телефон и адрес будут в формате неограниченной строки, а день рождения - еще одной записью. Цель здесь - создать систему управления адресной книгой (очень простая)

type birthday is record
    year  : Positive;
    month : Positive;
    day   : positive;
end record;

type contact_type is record
    name    : unbounded_string;
    phone   : unbounded_string;
    address : unbounded_string;
    bday    : birthday;
end record;

Я уже сделал вставку (используя приложение), функцию удаления и списка. Мне нужна функция поиска и сортировки, чтобы закончить.

Дело в том, что я превратил эту запись (запись contact_type) в вектор. Теперь я хочу найти в векторе один из элементов / подклассов (как бы вы это ни называли правильно).

Например, поиск по имени ... Или по адресу и т. Д. Но с помощью метода вектора find_index мне нужно вставить еще одну запись типа contact_type, и в результате будет возвращен только точно такой же элемент.

Но я хочу, чтобы при поиске по имени возвращались все элементы с именем ...

И будет ли возможность "Общей сортировки" вектора с точки зрения имени, адреса, Bday (у меня есть три различных варианта сортировки)

PS. Первая программа Ada, которую я пишу, это менеджер адресной книги ... Я полный новичок, и у меня есть только опыт работы с Си и Java, так что это немного не так ... (Мне потребовалось много времени, чтобы выяснить, как стандартный ввод и вывод lol)

Ответы [ 4 ]

5 голосов
/ 16 мая 2011

Когда я начал изучать Аду, я написал довольно длинную вики-статью об Ada.Containers.Vectors.Это помогло мне вспомнить все многие опции, которые доступны вам при использовании этого пакета.В статье приведены примеры того, как перебрать вектор, как его найти и как его отсортировать.

http://wiki.ada -dk.org / index.php / Ada.Containers.Vectors

Наслаждайтесь!: О)

2 голосов
/ 16 мая 2011

как насчет простого просмотра контента?

function Find_Name (V : Vector; Name : String) return Contact_Type is
   Position : Cursor := V.First;
begin
   while Position /= No_Element loop
      if Element (Position).Name = Name then
         return Element (Position);
      end if;
      Next (Position);
   end loop;
   return Empty_Contact;
end Find_Name;
2 голосов
/ 15 мая 2011

Вместо Find_Index, используйте Iterate и передайте ему подпрограмму, которая проверяет каждую посещенную запись.

package Container is new Containers.Vectors (Natural, Contact_Type);
List : Container.Vector;
...
procedure Visit (Position : Container.Cursor) is
    C : Contact_Type := Container.Element(Position);
begin
    -- examine C
end Visit;
...
List.Iterate (Visit'Access);

Вы можете использовать аналогичный шаблон для создания ключей сортировки,См. Также A.18.16 Сортировка массива .

Приложение: Как отмечает @Simon Wright, Generic_Sorting в Containers.Vectors является лучшим выбором.

1 голос
/ 16 мая 2011

@ oenone ответ хорош, пока есть только один соответствующий элемент.В противном случае вы можете попробовать что-то вроде

function Find_Name (V : Vector; Name : String) return Vector is
   Position : Cursor := V.First;
   Result : Vector;
begin
   while Position /= No_Element loop
      if Element (Position).Name = Name then
         Append (Result, Element (Position));
      end if;
      Next (Position);
   end loop;
   return Result;
end Find_Name;
...