Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

чайник про множества   Найти похожие ветки 

 
denis24   (2005-01-14 10:56) [0]

Даже стыдно спрашивать.....
Как проверить входит ли строковая перемен в множество
например
str:="aa"
if str not in ["bb","cc","dd"] then......


 
Fay ©   (2005-01-14 10:57) [1]

Так низя - это подойдёт только для ординальных типов.


 
denis24   (2005-01-14 10:59) [2]

тока if?


 
denis24   (2005-01-14 11:00) [3]

тока if?


 
Fay ©   (2005-01-14 11:01) [4]

В общем случае - да, только if.


 
Гы   (2005-01-14 11:05) [5]

Гы-гы ... попробуй for...


 
ЮЮ ©   (2005-01-14 11:10) [6]


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


 
begin...end ©   (2005-01-14 11:15) [7]

> [6] ЮЮ ©   (14.01.05 11:10)

Модуль StrUtils, функция AnsiIndexStr.


 
Anatoly Podgoretsky ©   (2005-01-14 13:26) [8]

str:="aa"
if Pos(str, "bbccdd") > 0 then......


 
Fay ©   (2005-01-14 13:27) [9]

str := "bc"


 
Юрий Зотов ©   (2005-01-14 13:46) [10]

if SringList1.IndexOf("aa") >= 0 then ...

При Sorted=True сработает существенно быстрее, чем прямой перебор по массиву.


 
begin...end ©   (2005-01-14 13:50) [11]

> [10] Юрий Зотов ©   (14.01.05 13:46)

> сработает существенно быстрее, чем прямой перебор по массиву

Да, но StringList вначале надо создать и заполнить.


 
Юрий Зотов ©   (2005-01-14 13:54) [12]

begin...end ©   (14.01.05 13:50) [11]

Э-э-э... а массив не надо?


 
begin...end ©   (2005-01-14 14:01) [13]

> [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.


 
begin...end ©   (2005-01-14 14:03) [14]


> if AnsiIndexStr(Str, ["aa", "bb", "cc"]) then

if AnsiIndexStr(Str, ["aa", "bb", "cc"]) >= 0 then


 
Юрий Зотов ©   (2005-01-14 14:08) [15]

> begin...end ©   (14.01.05 14:01) [13]
> Я просто понял задачу автора ветки так: нужно проверить,
> встречается ли заранее НЕизвестная строка в заранее известном
> множестве (см. его пост [0]). Массив можно "создать" при
> передаче его в AnsiIndexStr

Я тоже понял именно так. А если множество строк заранее известно, то зачем же создавать его каждый раз заново, если можно (и нужно) сделать это один раз?

А потом просто вызывать IndexOf.


 
begin...end ©   (2005-01-14 14:11) [16]

> [15] Юрий Зотов ©   (14.01.05 14:08)

> А если множество строк заранее известно, то зачем же создавать
> его каждый раз заново, если можно (и нужно) сделать это
> один раз?

Если проверка будет встречаться не один раз, то я, возможно, соглашусь. Если же, наоборот, проверка на "вхождение" - только в одном месте кода, то я не согласен.


 
Юрий Зотов ©   (2005-01-15 11:50) [17]

> begin...end ©   (14.01.05 14:11) [16]

Естественно. Все зависит от задачи.


 
Anatoly Podgoretsky ©   (2005-01-15 14:45) [18]

Fay ©   (14.01.05 13:27) [9]
Вопрос был про aa, пусть для начала уточнит свой вопрос.


 
SergP ©   (2005-01-15 15:19) [19]


>  [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......


 
avik ©   (2005-01-15 16:18) [20]

проще всего использовать массив и проверочку
if или case  по честному!!!
удачи !!!


 
Anatoly Podgoretsky ©   (2005-01-15 16:39) [21]

SergP ©   (15.01.05 15:19) [19]
Тут две ошибки, сработает и для невхождения, кроме того сработает не так, надо две проверки POS>0 и вторая mod 2) = 0


 
Anatoly Podgoretsky ©   (2005-01-15 16:41) [22]

А лучше использовать вместо mod функцию even/odd


 
Anatoly Podgoretsky ©   (2005-01-15 16:42) [23]

Ошибся одна ошибка = 1 правильно.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.037 c
14-1105276697
Бугага
2005-01-09 16:18
2005.01.30
Призрак оперы


1-1105616282
Jupiter
2005-01-13 14:38
2005.01.30
Вопросы по Dll


4-1102800675
Piter
2004-12-12 00:31
2005.01.30
Перехват функций


1-1106072728
Magic_STI
2005-01-18 21:25
2005.01.30
Неодинаковое время выполнения. Почему?


1-1105691044
Zilog
2005-01-14 11:24
2005.01.30
Можно ли текстоввый файл запихнуть в DLL?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский