| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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, вот это и будет последняя строка |
| Автор: Hiori 30.3.2016, 07:45 |
не, это совсем не о том так и сделала пока, но, к сожалению, при 200к+ строк это уже вызывает серьезную задержку, буду думать, спасибо |
| Автор: dnek 30.3.2016, 08:31 | ||||
используйте цикл
для сравнения строк используйте SameStr или CompareStr Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/TStringListIndexOf-posledneye-vkhozhdeniye-id56fa23bbae201536278b4567#findElement_E7045_56fb64a8ae2015ae4c8b45fa_0 |
| Автор: seer.true 30.3.2016, 08:46 | ||
| какой перебор? у нас есть соunt
Если вам надо получить максимальный индекс строки с одинаковым содержимым сначала попробуйте сортировку. А вообще, в том объеме как рассказано в вопросе задача не имеет смысла, вам надо что-то менять в архитектуре. Если есть желание, опишите, зачем вам это? Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/TStringListIndexOf-posledneye-vkhozhdeniye-id56fa23bbae201536278b4567#findElement_E7045_56fb6844ae2015414b8b4947_0 |
| Автор: 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 | ||
Нет, это не так. Это некая хэш-таблица. Объявлена она в 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 | ||
Надо было это в самом начале указать. 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 то что нужно, вопрос решен |