![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
принадлежит ли значение набору
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]парсер