Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TStringList.IndexOf последнее вхождение 
V
    Опции темы
Hiori
Дата 29.3.2016, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



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

как получить в данном случае 3, а не 0?
PM MAIL   Вверх
Vas
Дата 29.3.2016, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 4
Всего: 28



Скорее только перебором в цикле

Это сообщение отредактировал(а) Vas - 29.3.2016, 14:16


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
ZBugz
Дата 30.3.2016, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



А там помойму есть .count, вот это и будет последняя строка smile 
PM MAIL   Вверх
Hiori
Дата 30.3.2016, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



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

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


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

так и сделала пока, но, к сожалению, при 200к+ строк это уже вызывает серьезную задержку, буду думать, спасибо
PM MAIL   Вверх
dnek
Дата 30.3.2016, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



Цитата

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

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

for i = StringList.Count - 1 downto 0

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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
seertrue
Дата 30.3.2016, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 12.12.2010

Репутация: нет
Всего: нет



какой перебор?
у нас есть со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://vingrad.com
PM MAIL   Вверх
Hiori
Дата 30.3.2016, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



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


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

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

Это сообщение отредактировал(а) Hiori - 30.3.2016, 20:24
PM MAIL   Вверх
dnek
Дата 30.3.2016, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Hiori
Дата 31.3.2016, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



это, насколько я поняла, некий аналог TValueListEditor? собственно, пока искала решение наткнулась на этот компонент. есть ли какие-то кардинальные отличия?
PM MAIL   Вверх
Hiori
Дата 31.3.2016, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



да, забыла добавить, скорость доступа к конкретному ключу для меня критична, так как этот массив данных вспомогательный, и при обработке каждого элемента других файлов производится до 5 обращений к массиву строк
PM MAIL   Вверх
dnek
Дата 31.3.2016, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



Цитата

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

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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Hiori
Дата 31.3.2016, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



давайте я опишу задачу в целом. иначе мы говорим беспредметно.
есть некая игра, онлайн ессно, контент которой основывается на 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, что нужно конкретно мне, чтобы работать с классами, которые вы указываете в постах?
PM MAIL   Вверх
dnek
Дата 31.3.2016, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.4.2013

Репутация: нет
Всего: нет



Цитата

   я пишу в delphi 7
   

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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Hiori
Дата 31.3.2016, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



спасибо, TDynArrayHashed то что нужно, вопрос решен
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.