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

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

принадлежит ли значение набору


J.S. ©   (2009-03-25 16:23:00) 

Столкнулся с проблемой: необходимо проверить принадлежит ли челочисленное значение набору значений (набор значений представлен строкой вида "1-6, 11, 22-46"). Какие Вы можете посоветовать варианты реализации?.


Германн   (2009-03-27 00:46:00) [1]


> жж   (26.03.09 19:18) [8]
>
>
> > Германн ©   (26.03.09 00:34) [7]
>
>
> Да в общем то, недолго.
>
> а по  поводу сетов не совсем ясно - как перевести строку
> такого формата в сет без парсинга

Парсинг ты уже сделал. Но сам вопрос не ясен. Откуда автор получает эту строку?
Может и парсинг не нужен?
Но без участия в форуме автора - дальнейшее обсуждение не имеет смысла!


Zeqfreed   (2009-03-26 21:04:00) [2]

def mrange(spec):
         for rng in spec.split(','):
                 if rng.find('-') > -1:
                         min, max = rng.split('-')
                 else:  
                         min, max = [rng] * 2
                 for i in xrange(int (min), int (max) + 1):
                         yield i

for i in range(0, 25):
         if i in mrange('1-6,11,22-24'):
                 print '%d in range' % i


Само изящество :)


жж   (2009-03-26 19:18:00) [3]


> Германн ©   (26.03.09 00:34) [7]


Да в общем то, недолго.

а по  поводу сетов не совсем ясно - как перевести строку такого формата в сет без парсинга


Германн   (2009-03-26 00:34:00) [4]


> жж   (26.03.09 00:20) [6]

Я бы не стал изобретать некие функции с ограниченной областью применения, пока автор не ответил на [3] и [4].
Или хотя бы вообще вновь появился на форуме. :)


жж   (2009-03-26 00:20:00) [5]

function IsPartOf(X: Integer; S: string): Boolean;
var
 SL: TStringList;
 N: Integer;
 s1, s2: string;
begin
 Result:=false;
 SL:=TStringList.Create;
 try
   SL.Delimiter:=',';
   SL.DelimitedText:=s;
   for I:=0 to SL.Count - 1 do
   begin
     N:=Pos('-', SL[I]);
     if N = 0
      then Result:=(X = StrToInt(SL[I]))
      else begin
        s1:=Copy(Sl[I], 1, N);
        s2:=Copy(Sl[I], N + 1, Length(SL));
        Result:=X >=StrToInt(s1) and X <=StrToInt(s2);
      end;
     if Result then Break;
   end;
finally
 SL.Free;
end;

ЗЫ
Набивал текст тут, так что не отлажено, обработка ошибочных входных данных, например "1-6, 11, 22а-46" отсутствует, тут уж сам)


Anatoly Podgoretsky   (2009-03-25 17:06:00) [6]

> J.S.  (25.03.2009 16:23:00)  [0]

Посоветую set of char


Юрий Зотов   (2009-03-25 17:02:00) [7]

const
 ValidValues = [1..6, 11, 22..46];
var
 Value: byte;
========
if Value in ValidValues then ...


MBo   (2009-03-25 16:42:00) [8]

3. если диапазон позволяет, перевести строку в set


clickmaker   (2009-03-25 16:41:00) [9]

1.посимвольный разбор
2.регулярные выражения


Jeer   (2009-03-25 16:41:00) [10]

парсер


Наверх

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