Объясните подробнее что за индексы.
Индекс - текущий элемент в списке.
Например: 0,1,2,3,4,5,6,7,8,9,10
Если читать и всегда удалять текущий элемент, то индекс всегда нулевой, а вот если переходить на следующий без удаления, нужно отслеживать текущую позицию, где происходит чтение.
То есть, методы на подобии .Succ (следующий) и .Pred (предыдущий) и свойство Индекс где-то реализовано ? Пока читаю связанные списки.
Тогда не укладывается это
Зачем массив индексов если индекс 1?
Индекс (указывающий на текущий элемент) всегда нулевой только если после чтения элемент обязательно удаляется
x:=L[i].FirstOrDefault; // подразумевается 0-й элемент
L[i].RemoveAt(0); // 1-й стал нулевым, новый индекс запоминать не нужно
а вот если ненужно удалять, следует перейти на новый элемент и обновить текущий “индекс”
x:=L[i] [N[i]]; // получить из i-го списка N[i]-й элемент
N[i]+=1; // перейти на следующий
// и проверить границы
Проблема в том, что таких списков более десятка - неудаляемые (точно читаются), удаляемые (значения после прочтения всегда удаляются) и смешанные (некоторые элементы читаются, а другие после чтения удаляются) и в обе стороны.
Я думал как одна птица, что проблема будет с добавлением новых значений в конец списков, но всё нормально и пока выбираю между классами или чем-то более подходящим чем List-ы.
То есть у вас List<List<>>
+ вообще в отдельной переменной индексы в каждом внутреннем списке? Это плохо. Индексы должны быть в той же переменной, иначе очень легко забыться и добавить сложно-ловимый баг.
type
LstPlusInd<T> = class //ToDo нормальное название
private lst: List<T>;
private ind: integer;
//ToDo реализовать все нужные вам операции
end;
begin
var l := new List<LstPlusInd>;
end.
Самая неграмотная фраза, из всех что я встречал в последние, наверно, полгода. В списке нет индексов, там есть только голова, хвост и текущий элемент. А еще там есть связи.
Это в связном списке, а про него ничего не говорили.
В несвязном просто нет связей. Голова, хвост и текущая позиция. Как ленточка в машине Поста. А List в .NET - это не список в его классическом понимании, это динамическая структура на базе ассоциативного массива.
Александр, в десятке списков нужно отслеживать каждый последний прочитанный номер элемента (“индекс”, “курсор”, “указатель”), а без внешней инфраструктуры это возможно только с обязательным удалением (см. пример выше).
Именно поэтому и приходится как-то запоминать “индексы”, что и стало причиной вопроса. Так что поделитесь обоснованным мнением: оставить списки с массивами, списки лучше заменить на что-то другое (класс) или же не отвлекайте тех, кто может знать ответ. Спасибо
Пишите осторожнее - вас студенты читают.
Список построен на базе непрерывного участка памяти. Список - оболочка над массивом с возможностью расширения.
Хорошо. Д. Кнут, например, различает линейные списки (стек, очередь, дек), циклические и нелинейные (связные), такие как деревья. Ни в одной такой информационной структуре индексами и не пахнет. У М.Абрамяна о List говорится, как об обобщенным классе, реализующим поведение списка и выполненном на базе массива. Майкрософт поясняет, что коллекция List представляет собой строго типизированный список объектов, доступных по индексу. Но в любом варианте это не есть классический список. Когда говорят об объекте коллекции List - вопросов нет. Но когда говорят о списке, а потом выясняется, что имеется в виду List - ну это как в Питоне называют списки массивами, привыкают к этой мысли, а потом всегда считают, что массив - это и есть список.
Пока Вы нормально не поясните, что называете “списком”, говоря об отслеживании в их десятках тех или иных элементов, угадать как обрабатывать это “то, не знаю что” нереально.
Реально. С чего вы решили, что при слове “список” надо вспоминать кнута и “связный список”?
Слово “список” встречается в куда более общем контексте - список учеников в журнале например.
В .NET есть прямой тип List - когда мы говорим “список” в NET - мы подразумеваем именно его.
А когда мы говорим “связный список”, - подразумеваем LinkedList
С того, что понятие “список” в обиходе - это синоним слова “перечень”. А в программировании есть свое понятие списка и оно Уже общебытового.
Вот именно потому я и хотел бы уточнения, о каком списке речь - .NET или общебытовом.
Если упрощённо, пусть имеются файлы
А=2,3,2,-2,0,1... Б=1,4,-1,0,30... В=3,3,-2,3,-4...
начальная позиция которых («индексы») указывает на первые элементы (по нулям).
Прочитав из файла А значение альфа (2), нужно в файле Б сместиться вверх или вниз (положительное или отрицательное) на указанное количество элементов и узнать значение бета (4), а в файле В также сместиться вверх или вниз на бета элементов и прочитать в переменную гамма (3), удаляя этот элемент. Особенность в том, что файлы учитывают текущее положение.
Так как таких файлов с десяток и сложнее удалять-добавлять в произвольном порядке, я сделал массив List<integer>
и вынес их текущую позицию («индексы») в отдельный массив, что не очень удобно. Все списки «зациклены» и периодически пополняются.
Структура и подход приемлемы или есть более подходящие варианты ?
Если нужны множественные вставки и удаления, проще всего, безусловно, использовать готовые списочные структуры. Для прямой выборки элемента по его номеру ничего эффективнее массива пока что не придумано. Списки List в .NET реализуют сразу оба подхода к хранению и выборке данных, поэтому они - достаточно удачный выбор. Если имеются какие-то особые алгоритмы, связанные со спецификой обрабатываемых данных, можно попытаться реализовать собственный класс. Например, в базах данных существует понятие совокупности индексных файлов, когда сами элементы данных упорядочиваются и удаляются нечасто (это определяет система управления базой данных), а доступ осуществляется через целую систему индексных файлов, содержащую ключи и такие файлы строятся, например, на основе сбалансированных В-деревьев, что обеспечивает высокую скорость поиска. Но, насколько я понял, это не Ваш случай, у Вас поиск простой, практически это косвенная адресация.
Почему максимальный индекс динамического массива = 536870897?
Откуда вы взяли это число?
2^29 -5. Занимательно.
Число-то откуда?
Ну вот беру я, пишу в программе код:
var
a: array of integer;
begin
a:=new integer[536870898];
end.
Выполняю. Выдаёт ошибку:
Ошибка времени выполнения: System.OutOfMemoryException: Измерения массива превысили поддерживаемый диапазон.
Стек:
в Program1.Program.$Main() в C:\PABCWork.NET\Program1.pas:строка 4
в Program1.Program.Main()
Почему?