2015-02-05 2 views
0

Возможно ли сохранить массив внутри другого массива, чтобы можно было хранить больше данных.Возможно ли в Delphi иметь массив внутри другого массива?

Например, массив содержит 5 переменных строк: Charlie, Tom, Harry, Jane and Josh. Если бы каждый из них содержал массив, в котором хранятся имена их пяти друзей.

Возможно ли это в Delphi?

Использование этого: Я создаю программу, которая принимает предпочтение голосов для пяти кандидатов, каждый кандидат должен иметь свой собственный массив, являющийся первой переменной в массиве, показывает, сколько у них первых предпочтений и так далее. Мне нужно ввести эти данные в массив, содержащий имена кандидатов, как уже объяснялось.

+0

Да, это возможно. Возможно, с записью, которая держала человека, а также их друзей. Затем массив из этих записей. Или, возможно, общий «TList ». Или, возможно, какая-то другая структура. Вид зависит от того, что вы намерены делать с структурой данных. –

+2

Или простой старый многомерный массив. –

+0

@KenWhite Итак, 'arr [0] [0]' является человеком, а 'arr [0] [1]' является первым другом, 'arr [0] [2]' вторым другом и так далее. Это не выявляет сильной разницы между человеком и другом. –

ответ

1

Можно ли хранить один массив в другом массиве с помощью Delphi? Да. Простейший способ реализовать это следующим образом:

//Standard one dimensional array of Strings 
AMyArray: Array[0..5] of String; 

//Array containing multiple Standard one dimensional arrays 
//Or in other word two dimensional array 
MYArrayColection: Array[0..4] of AMyArray; 

Примечание для того, чтобы добиться того, что вы wan't ваш один одномерный массив должен содержать 6 элементов. Первый элемент хранит имя вашего лица. Следующие пять магазинов имена его/ее друзей

Но это плохой дизайн. Зачем?
Если мы посмотрим на ваш пример, Чарли, Том и Хари, у всех может быть Джейн как жареная. Это означает, что вы будете хранить свое имя в миллион раз и делать это, потребляя больше памяти.
Теперь с небольшим количеством pepole и smal количество firends это не создает проблемы, но когда у вас большое количество pepole с большим количеством друзей (что вам может понадобиться позже), это может стать реальной проблемой, поскольку вы можете быть из-за этого теряется много мнений.

Сначала вместо хранения информации о лицах в строке хранят ее в записи. Эта запись должна иметь поле «Имя» для хранения имен людей и массива целых чисел для хранения дружеских соединений. Почему массив целых чисел?
Станьте следующим, что вам нужно сделать, это создать массив записей TPerson, чтобы хранить записи pepole. Как только у вас есть это, вы сначала заселяете массив pepole всеми доступными pepole, но в это время вы по-прежнему не заполняете информацию о своих друзьях.
После того, как вы заполнили массив pepole, вы начинаете вводить информацию об увольнении для каждого человека. Но вместо сохранения имени друзей вы просто храните индекс, в котором этот друг хранится в массиве pepole.

Так что код это будет выглядеть примерно так:

//Record used to store information about individual person 
TPerson = record 
    //Persons name field 
    Name: String; 
    //Array storing index references to persons friends 
    Friends: Array[0..4] of Integer; 
end; 

//Array storing multiple person records 
Pepole: Array[0..4] of TPerson; 

Это, как вы получите имя первого человека, хранящегося в pepole массиве:

PersonsName := Pepole[0].Name; 

Это, как вы бы получить имя второго друга вашего первого человека, хранящегося в массиве pepole

SecondFriendsName := Pepole[Pepole[0].Friends[1]].Name; 

Этот вызов может быть немного сложнее понять.
Код внутри квадратных квадратных скобок верхнего колонтитула возвращает индексный номер знакомой записи, которую мы ищем.

+0

Из-за того, что Delphi хранит строки, возможно, что память не будет потрачена впустую из-за дубликатов имен. Ofc это потребовало бы, чтобы все имена были назначены из общего источника. –

+0

Это правда, но я предположил, что в какой-то момент в будущем OP может также захотеть сохранить что-то большее, чем просто имена pepole, и в этом случае использование записей было бы предпочтительным, потому что, контролируя структуру записи, вы быстро контролируете информацию о whant сохраняются. – SilverWarior

0

В дополнение к ответам @SilverWarrior при условии, что есть еще один вариант. Хотя я рекомендую второй подход array of record.

Существует несколько способов объявления многомерного массива.
Пример 1:

type 
    TMyArray = array of string; //or array[0..N] of string if it's fixed size 
    TMyArrList = array of TMyArray;//or array[0..N] of TMyArray 

Пример 2:

var 
    MyArray: array of array of string;//Dynamic array will require SetLength for both main and subarrays 
    MyOtherArray: array[0..5] of array[0..5] of string; 

Пример 3: (фиксированной длины только и если массивы того же типа)

var 
    MyArray[0..5, 0..5] of string; 

Пример 3 является то, что я обычно, когда мне нужен многомерный массив.

Другая возможность для вашего примера - использование TDictionary, которое вы можете найти в Generics.Collections.
Это может выглядеть следующим образом:

type 
    MyFriends = Array[0..4] of String; 
//In class or function/procedure 
var 
    MyDict: TDictionary<String, MyFriends>; 

Надеется, что это поможет вам на пути немного.

+0

Спасибо, мне нравится ваш подход. – Stratmoss

Смежные вопросы