Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TStringList.IndexOf последнее вхождение


Автор: Hiori 29.3.2016, 09:40
В классе TStringList есть функция IndexOf, возможно ли как-то извлечь последнюю строку с таким текстом?
для примера:
Sys1_name
Sys2_name
Sys3_name
Sys1_name

как получить в данном случае 3, а не 0?

Автор: Vas 29.3.2016, 14:15
Скорее только перебором в цикле

Автор: ZBugz 30.3.2016, 07:18
А там помойму есть .count, вот это и будет последняя строка smile 

Автор: Hiori 30.3.2016, 07:45
Цитата(ZBugz @  30.3.2016,  07:18 Найти цитируемый пост)
А там помойму есть .count, вот это и будет последняя строка

не, это совсем не о том


Цитата(Vas @  29.3.2016,  14:15 Найти цитируемый пост)
Скорее только перебором в цикле

так и сделала пока, но, к сожалению, при 200к+ строк это уже вызывает серьезную задержку, буду думать, спасибо

Автор: dnek 30.3.2016, 08:31
Цитата

   при 200к+ строк это уже вызывает серьезную задержку
   

используйте цикл
Код

for i = StringList.Count - 1 downto 0

для сравнения строк используйте SameStr или CompareStr

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/TStringListIndexOf-posledneye-vkhozhdeniye-id56fa23bbae201536278b4567#findElement_E7045_56fb64a8ae2015ae4c8b45fa_0

Автор: seer.true 30.3.2016, 08:46
какой перебор?
у нас есть соunt

Код

var
  sl: TStringList;
  str: string;
begin
  sl:=TStringList.Create;
  sl.Add('Sys1_name');
  sl.Add('Sys2_name');
  sl.Add('Sys3_name');
  sl.Add('Sys1_name');
  str:=sl.Strings[sl.Count-1];
  sl.Free;
end;


Если вам надо получить максимальный индекс строки с одинаковым содержимым сначала попробуйте сортировку.
А вообще, в том объеме как рассказано в вопросе задача не имеет смысла, вам надо что-то менять в архитектуре.
Если есть желание, опишите, зачем вам это?


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/TStringListIndexOf-posledneye-vkhozhdeniye-id56fa23bbae201536278b4567#findElement_E7045_56fb6844ae2015414b8b4947_0

Автор: Hiori 30.3.2016, 20:23
Цитата(seertrue @  30.3.2016,  08:46 Найти цитируемый пост)
Если вам надо получить максимальный индекс строки с одинаковым содержимым сначала попробуйте сортировку.
А вообще, в том объеме как рассказано в вопросе задача не имеет смысла, вам надо что-то менять в архитектуре. 
Если есть желание, опишите, зачем вам это?


есть файл строк, формат записи:
key 78 байт
size 4 байта
string <size> байт

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

Автор: dnek 30.3.2016, 22:02
В Вашем случае лучше использовать TDictionary<String, String>. При заполнении проверять Dictionary.ContainsKey(key) и если существует просто заменять его значение. Если Вас интересуют и предыдущие значения по повторяющемуся ключу - используйте TDictionary<String, TStringList>

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/TStringListIndexOf-posledneye-vkhozhdeniye-id56fa23bbae201536278b4567#findElement_E7045_56fc22a9ae201588368b467d_0

Автор: Hiori 31.3.2016, 00:05
это, насколько я поняла, некий аналог TValueListEditor? собственно, пока искала решение наткнулась на этот компонент. есть ли какие-то кардинальные отличия?

Автор: Hiori 31.3.2016, 00:46
да, забыла добавить, скорость доступа к конкретному ключу для меня критична, так как этот массив данных вспомогательный, и при обработке каждого элемента других файлов производится до 5 обращений к массиву строк

Автор: dnek 31.3.2016, 01:28
Цитата

   это, насколько я поняла, некий аналог TValueListEditor
   

Нет, это не так. Это некая хэш-таблица. Объявлена она в System.Generics.Collections.
Скорость поиска довольно высокая т.к. внутри вся работа идет с хэш-кодами.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/TStringListIndexOf-posledneye-vkhozhdeniye-id56fa23bbae201536278b4567#findElement_E7045_56fc52fdae20154c618b4a46_0

Автор: Hiori 31.3.2016, 05:20
давайте я опишу задачу в целом. иначе мы говорим беспредметно.
есть некая игра, онлайн ессно, контент которой основывается на 50+ файлов данных. конечно их больше, но именно тех файлов, которые я хотела бы обрабатывать порядка пятидесяти.
собственно, проект, который я пишу предназначен для работы с этими базами игры. все db файлы имею равнозначную структуру, читать/писать их не представляет труда. для каждого предмета, скилла, брони и т.п. существует своя запись. но основной проблемой является именно файл строк, в нем слишком много данных.
возьмем пример предмета (условно его ID 220001), для него существует:
Sys220001_name - название
Sys220001_name_plural - множественное название
Sys220001_shortnote - описание
(на предмете может существовать 0-6 статов, каждый из которых имеет название)
Sys516001_name - Стат 1
Sys516002_name - Стат 2
Sys516008_name - Стат 3
Sys516019_name - Стат 4
так же у предмета может быть скилл комплекта (2-8 предметов, одетые одновременно являются комплектом, который имеет свое название)
Sys770001_name - название комплекта
и это не предел обращения к записям строк, условия значений я описала выше.
скорость чтения/записи не особо важны, главное - время обращения к указанному ключу и перебор всех ключей (для поиска).

я пишу в delphi 7, что нужно конкретно мне, чтобы работать с классами, которые вы указываете в постах?

Автор: dnek 31.3.2016, 08:43
Цитата

   я пишу в delphi 7
   

Надо было это в самом начале указать. TDictionary<> появился только в Delphi 2009.
Вам бы я посоветовал написать что-то свое или поискать уже готовые решения, связанные с реализацией hashmap-ов, например TDynArrayHashed из http://synopse.info/fossil/wiki/Synopse+OpenSource

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/TStringListIndexOf-posledneye-vkhozhdeniye-id56fa23bbae201536278b4567#findElement_E7045_56fcb8e4ae2015234b8b543a_0

Автор: Hiori 31.3.2016, 23:35
спасибо, TDynArrayHashed то что нужно, вопрос решен

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)