Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

чайник про множества [D6, Win2k]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо