![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
чайник про множества [D6, Win2k]
denis24 © (2005-01-14 10:56:00)Даже стыдно спрашивать.....
Как проверить входит ли строковая перемен в множество
например
str:='aa'
if str not in ['bb','cc','dd'] then......
Anatoly Podgoretsky (2005-01-15 16:42:00) [1]Ошибся одна ошибка = 1 правильно.
Anatoly Podgoretsky (2005-01-15 16:41:00) [2]А лучше использовать вместо mod функцию even/odd
Anatoly Podgoretsky (2005-01-15 16:39:00) [3]SergP © (15.01.05 15:19) [19]
Тут две ошибки, сработает и для невхождения, кроме того сработает не так, надо две проверки POS>0 и вторая mod 2) = 0
avik (2005-01-15 16:18:00) [4]проще всего использовать массив и проверочку
if или case по честному!!!
удачи !!!
SergP (2005-01-15 15:19:00) [5]
> [8] Anatoly Podgoretsky © (14.01.05 13:26)
> str:='aa'
> if Pos(str, 'bbccdd') > 0 then......
>
>
> [9] Fay © (14.01.05 13:27)
> str := 'bc'
Тогда:
str:='aa';
if (Pos(str, 'bbccdd') mod 2) =1 then......
Anatoly Podgoretsky (2005-01-15 14:45:00) [6]Fay © (14.01.05 13:27) [9]
Вопрос был про aa, пусть для начала уточнит свой вопрос.
Юрий Зотов (2005-01-15 11:50:00) [7]> begin...end © (14.01.05 14:11) [16]
Естественно. Все зависит от задачи.
begin...end (2005-01-14 14:11:00) [8]> [15] Юрий Зотов © (14.01.05 14:08)
> А если множество строк заранее известно, то зачем же создавать
> его каждый раз заново, если можно (и нужно) сделать это
> один раз?
Если проверка будет встречаться не один раз, то я, возможно, соглашусь. Если же, наоборот, проверка на "вхождение" - только в одном месте кода, то я не согласен.
Юрий Зотов (2005-01-14 14:08:00) [9]> begin...end © (14.01.05 14:01) [13]
> Я просто понял задачу автора ветки так: нужно проверить,
> встречается ли заранее НЕизвестная строка в заранее известном
> множестве (см. его пост [0]). Массив можно "создать" при
> передаче его в AnsiIndexStr
Я тоже понял именно так. А если множество строк заранее известно , то зачем же создавать его каждый раз заново , если можно (и нужно) сделать это один раз?
А потом просто вызывать IndexOf.
begin...end (2005-01-14 14:03:00) [10]
> if AnsiIndexStr(Str, ['aa', 'bb', 'cc']) then
if AnsiIndexStr(Str, ['aa', 'bb', 'cc']) >= 0 then
begin...end (2005-01-14 14:01:00) [11]> [12] Юрий Зотов © (14.01.05 13:54)
Я просто понял задачу автора ветки так: нужно проверить, встречается ли заранее НЕизвестная строка в заранее известноммножестве (см. его пост [0]). Массив можно "создать" при передаче его в AnsiIndexStr, например:
var
Str: String;
begin
if AnsiIndexStr(Str, ['aa', 'bb', 'cc']) then
...
end.
А в случае с TStringList придётся делать так:
var
Str: String;
begin
with TStringList.Create do
try
Sorted := True;
Add('aa');
Add('bb');
Add('cc');
if IndexOf(Str) >= 0 then
...
finally
Free
end
end.
Юрий Зотов (2005-01-14 13:54:00) [12]begin...end © (14.01.05 13:50) [11]
Э-э-э... а массив не надо?
begin...end (2005-01-14 13:50:00) [13]> [10] Юрий Зотов © (14.01.05 13:46)
> сработает существенно быстрее, чем прямой перебор по массиву
Да, но StringList вначале надо создать и заполнить.
Юрий Зотов (2005-01-14 13:46:00) [14]if SringList1.IndexOf('aa') >= 0 then ...
При Sorted=True сработает существенно быстрее, чем прямой перебор по массиву.
Fay (2005-01-14 13:27:00) [15]str := 'bc'
Anatoly Podgoretsky (2005-01-14 13:26:00) [16]str:='aa'
if Pos(str, 'bbccdd') > 0 then......
begin...end (2005-01-14 11:15:00) [17]> [6] ЮЮ © (14.01.05 11:10)
Модуль StrUtils, функция AnsiIndexStr.
ЮЮ (2005-01-14 11:10:00) [18]
function IsOneOf(const s: string; list: array of string): boolean;
var
i: integer;
begin
for i := low(list) to high(list) do
if AnsiCompareText(s, list[i]) = 0 then begin
result := true;
exit;
end;
result := false;
end;
Использовать:
if IsOneOf(str, ['bb','cc','dd']) then
Гы (2005-01-14 11:05:00) [19]Гы-гы ... попробуй for...
Fay (2005-01-14 11:01:00) [20]В общем случае - да, только if.