Форум: "Основная";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
Внизin кроме sets? Найти похожие ветки
← →
АТ (2003-10-02 16:48) [0]Как можно реализовать максимально просто что-то типа
if "text" in ("asasd","asdasd","asd") ... ?
Т.е. использовать in но не только с ordinal type?
← →
MBo (2003-10-02 16:52) [1]никак.
Поиск в сортированном списке строк или хэширование.
← →
Anatoly Podgoretsky (2003-10-02 17:01) [2]MBo © (02.10.03 16:52) [1]
Сортировка не требуется, достаточно поиска в списке, массив частный случай.
Само слово IN конечно придется переименовать и превратить в функцию.
← →
MBo (2003-10-02 17:05) [3]>Anatoly Podgoretsky
я указал про сортированный из-за скорости поиска (если большой список, конечно)
← →
Anatoly Podgoretsky (2003-10-02 17:37) [4]Да это понятно, тебе и мне, а вот насчет него не уверен
← →
АТ (2003-10-02 17:48) [5]Да нет, почему, все понятно. Просто мне давно было интересно можно ли именно стандартными средствами, без написания своих функций сделать поиск в массиве string.
Вообщем-то приходится пользоватся этим часто, а писать постоянно циклы или добавлять лишние компоненты не очень хочеться ...
← →
MBo (2003-10-02 17:53) [6]стандартными средствами - TStringList.IndexOf
← →
Карелин Артем (2003-10-02 17:58) [7]Ну еще можно типа if (pos(""text"",""asasd""asdasd""asd"")<>0) then
← →
АТ (2003-10-02 19:21) [8]Вот! То что нужно.
А ведь можно было и догадаться, - так нет, все тянет к стандартным процедурам и .т.д. и т.п. Спасибо большое!
← →
Тих (2003-10-02 21:16) [9]моя любимая.
function IsIn(const Value: string; const ASet: array of const): boolean;
var i: integer;
begin
Result := false;
for i:=0 to High(ASet) do
if string(ASet[i].VAnsiString) = Value then Result := true;
end;
if IsIn("aa", ["aaa", "bbb", "ccc", "dddd"]) then writeln("true");
← →
Anatoly Podgoretsky (2003-10-02 21:24) [10]Тих (02.10.03 21:16) [9]
А давай посмотрим сколько времени она будет работать на миллоне строк и сравним потом с TStringList.IndexOf
Надеюсь, что у тебя нервы крепкие в обморок не упадешь
← →
Тих (2003-10-02 21:32) [11]У меня будет работать в среднем половину времени от полной итерации по массиву. А давайте подумаем, имеет ли смысл рожать TStringList для условия, предложенного автором вопроса - выбор из трех-четырех-десяти значений. Вариант с миллионом строк, возможно, для СУБД и уместен, но там и TStringList подавится.
← →
Palladin (2003-10-02 21:38) [12]
> Тих (02.10.03 21:32) [11]
ничем он не давится... прекрасно отрабатывает...
← →
Тих (2003-10-02 21:42) [13]Вот давайте пофлеймим на тему, почему Oracle написан не на Delphi и зачем придумана STL.
http://www.rsdn.ru/article/devtools/perftest.xml
← →
Anatoly Podgoretsky (2003-10-02 21:58) [14]Тих (02.10.03 21:32) [11]
Чего, половину, срочно марш в Потрепаться
← →
Palladin (2003-10-02 22:12) [15]TStringList при поиске значения в отсортированном списке размером в один миллион сделает около 30 итераций...
← →
Palladin (2003-10-02 22:13) [16]думаю немножко не сравнимо с твоей функцией...
← →
Тих (2003-10-02 22:13) [17]Anatoly Podgoretsky © (02.10.03 21:58) [14]
Ладно вам, накинулись )
function IsIn(const Value: string; const ASet: array of const): boolean;
var i: integer;
begin
Result := false;
for i:=0 to High(ASet) do
if string(ASet[i].VAnsiString) = Value then
begin
Result := true;
Exit;
end;
end;
Вот теперь половину.
← →
Anatoly Podgoretsky (2003-10-02 22:20) [18]Тих (02.10.03 22:13) [17]
Не накинулся, но не надо утверждать, то чего нет в функции.
Вот теперь нет возражений.
И последняя оптимизация Result := false, надо поставить перед последним end
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c