(решено) Оператор in - вопрос
Модератор: Модераторы
(решено) Оператор in - вопрос
Всем хорошего дня.
( в поиске IN найти очень сложно, не ругайтесь пожалуйста )
if ('a' in ['b','c','d']) then ... <== вот так работает.
if ('aq' in ['bq','cq','dq']) then ... <== вот так уже не работает(ругается).
if ('sdfgs' in arraySomeStrings ) then ... <== вот так тоже не работает(ругается).
В оператор in можно ли сверять массив?
В оператор in можно ли сверять строки, как в MySQL или только char?
Или я вообще неправильно его пытаюсь использовать и там сверяется что-то другое?
спасибо.
( в поиске IN найти очень сложно, не ругайтесь пожалуйста )
if ('a' in ['b','c','d']) then ... <== вот так работает.
if ('aq' in ['bq','cq','dq']) then ... <== вот так уже не работает(ругается).
if ('sdfgs' in arraySomeStrings ) then ... <== вот так тоже не работает(ругается).
В оператор in можно ли сверять массив?
В оператор in можно ли сверять строки, как в MySQL или только char?
Или я вообще неправильно его пытаюсь использовать и там сверяется что-то другое?
спасибо.
Последний раз редактировалось vitaly_l 05.09.2015 20:14:42, всего редактировалось 2 раза.
А что в вашем понимании "сверяется"?
Если сравнение то это описано и в книгах, и на просторах (comparestr)). Если вам необходим поиск то и сие аналогично (pos).
Если сравнение то это описано и в книгах, и на просторах (comparestr)). Если вам необходим поиск то и сие аналогично (pos).
pupsik писал(а):А что в вашем понимании "сверяется"?
Ну в первом примере он проверяет есть ли 'a' в массиве ['b','c','d'] (точнее я думал что это массив, но оказалось что массив туда нельзя подгрузить)
Туда что-нить кроме букв (char) можно вносить? Массив?
Вот ещё методом тыка нашел работает с цифрами if (12 in [225,325,452]) then но предупреждает про 325,452...
Паскалевский IN только от 0 - 255 сверяет? Да?
Добавлено спустя 1 минуту 14 секунд:
Что можно класть на "весы", что там может быть справа и слева?
Добавлено спустя 1 минуту 42 секунды:
А ещё вот так можно видел где-то... iN (12 in [0..255]) then
А мне хочется там строки и массивы сравнить или хотя-бы цифры, точнее id .
Добавлено спустя 3 минуты 7 секунд:
Или точнее ЛЮБОЕ что-то, что можно создавать/менять динамически. А то здесь всё задаётся жёстко.
чтобы примерно так получилось:
if id in arrayOfId then ...
А arrayOfId - всегда меняется... и соответственно id тоже (по принципу MySQL)
Последний раз редактировалось vitaly_l 05.09.2015 16:39:10, всего редактировалось 1 раз.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Оператор in проверяет есть элемент A в множестве B, то есть A in B
В первом случае 'a' есть элемент множества char. Во втором и третьем элементы - строки. Во втором посте элемент 12 - элемент целочисленного множества.
Оператор in на массивах не работает
Добавлено спустя 6 минут 39 секунд:
То есть туда можно вносить все, что может быть множеством согласно Pascal
[0..255] означает множество, в котором "включены" все числа от 0 до 255
Можно задать тип множества
TMySet=set of Byte, set of char или set of TEnum, где TEnum определенное Вами перечислимое. К примеру, TEnum = (enumFirst, enumSecond...)
В первом случае 'a' есть элемент множества char. Во втором и третьем элементы - строки. Во втором посте элемент 12 - элемент целочисленного множества.
Оператор in на массивах не работает
Добавлено спустя 6 минут 39 секунд:
Туда что-нить кроме букв (char) можно вносить? Массив?
То есть туда можно вносить все, что может быть множеством согласно Pascal
А ещё вот так можно видел где-то... if (12 in [0..255]) then
[0..255] означает множество, в котором "включены" все числа от 0 до 255
Или точнее ЛЮБОЕ что-то, что можно создавать/менять динамически. А то здесь всё задаётся жёстко.
чтобы примерно так получилось:
if id in arrayOfId then ...
А arrayOfId - всегда меняется... и соответственно id тоже (по принципу MySQL
Можно задать тип множества
TMySet=set of Byte, set of char или set of TEnum, где TEnum определенное Вами перечислимое. К примеру, TEnum = (enumFirst, enumSecond...)
Ichthyander писал(а):Во втором и третьем элементы - строки.
Добавлено спустя 12 минут 24 секунды:
Нет.. всё равно строку он не даёт вставить в множество. Только byte или char или свой набор.
строку он мне не даёт проверять в множестве... Компилятор ругается, F9 не запускает...
Код: Выделить всё
type
TMyEnumStr = set of string;
TMyEnumInt = set of integer;
Я чего-то не так делаю? или ему запрещено больше байта?
.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Integer не может быть множеством (слишком диапазон большой для этого).
Наборы строк непосредственно также не могут быть множеством. В своем первом посте, где я написал во втором и третьем случае строки это означало, что во втором и третьем случае именно строки, а не множества. Просто меня не так поняли: для меня строки уже естественным образом не являются множеством, поэтому не уточнил )
Но если Вам просто нужны именованные множества, то можно сделать так, как я описал выше, присвоив элементам множества осмысленные названия, к примеру, перечислимый метод цветов: TMyEnum=(enumRed, enumGreen, enumBrown).
Если же нужны именно строки, то выход также есть. К примеру:
Добавлено спустя 16 минут 46 секунд:
Да, если не ошибаюсь, 255 элементов являются ограничением множества. Но как правило для множество больше и не надо
Наборы строк непосредственно также не могут быть множеством. В своем первом посте, где я написал во втором и третьем случае строки это означало, что во втором и третьем случае именно строки, а не множества. Просто меня не так поняли: для меня строки уже естественным образом не являются множеством, поэтому не уточнил )
Но если Вам просто нужны именованные множества, то можно сделать так, как я описал выше, присвоив элементам множества осмысленные названия, к примеру, перечислимый метод цветов: TMyEnum=(enumRed, enumGreen, enumBrown).
Если же нужны именно строки, то выход также есть. К примеру:
Код: Выделить всё
type
TMyEnumColor=(enumRed, enumGreen, enumBrown...);
TColorStringArray=array[TEnumColor] of String;
TColorSet=set of TMyEnumColor;
const
AColors:TColorStringArray = ['Red', 'Green', 'Brown'...]Добавлено спустя 16 минут 46 секунд:
vitaly_l писал(а):Я чего-то не так делаю? или ему запрещено больше байта?.
Да, если не ошибаюсь, 255 элементов являются ограничением множества. Но как правило для множество больше и не надо
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Как верно написали выше - во всех версиях Паскаля множества ограничены перечисляемыми типами (читать руководство, что это такое) т.е. 0..255. Строки не могут быть перечисляемыми типами. Символы могут быть - только только в однобайтовой кодировке.
ЗЫ. Если необходимо работать с набором объектов аналогично множеству (включение, объединение, пересечение), то используют дополнительные библиотеки, например, широко известную DeCAL.
ЗЫ. Если необходимо работать с набором объектов аналогично множеству (включение, объединение, пересечение), то используют дополнительные библиотеки, например, широко известную DeCAL.
Ichthyander писал(а):255 элементов являются ограничением множества. Но как правило для множество больше и не надо
Снег Север писал(а):во всех версиях Паскаля множества ограничены перечисляемыми типами (читать руководство, что это такое) т.е. 0..255.
Снег Север писал(а):используют дополнительные библиотеки, например, широко известную DeCAL.
Я просто подумал что в Паскале IN равнозначен IN в MySQL. Но я ошибся. Там можно динамически набрать много ID и потом при помощи IN выявить и загрузить нужные. Подключать библиотеку - это на мой взгляд здесь лишнее, т.к. можно другими стандартными способами решить задачу.
Большое всем спасибо! Вопрос решён.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Снег Север писал(а):во всех версиях Паскаля множества ограничены перечисляемыми типами
Оказывается, я неправ - в новой среде разработки PascalABC.NET множества расширили до любого типа, включая строки и классы.
Снег Север писал(а): в новой среде разработки PascalABC.NET множества расширили до любого типа, включая строки и классы.
Это в Лазарусе есть? Если нет, то нужно ждать, рано или поздно, эту фишечку подключат. Хотя можно попробовать написать разработчикам.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Нету. PascalABC.NET использует возможности dotnet, там такое реализуется очень просто.vitaly_l писал(а):Это в Лазарусе есть?
Вот в другой ветке нарыл, если кому понадобится, вот так с IN работают: и string, и array (может кому понадобится):
оказалось что для if и для for: in - работает по разному...
.
Код: Выделить всё
var
test:string;
current:char;
arr: array [0..5] of string;
begin
test:='Test string?';
arr[0] := 'edtfg1';
arr[1] := 'edtfg2';
arr[2] := 'edtfg3';
arr[3] := 'edtfg4';
arr[4] := 'edtfg5';
arr[5] := 'edtfg6';
for current in test do SynEdit.lines.Add(current);
for test in arr do SynEdit.lines.Add(test);
end;
оказалось что для if и для for: in - работает по разному...
.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Какая неожиданность!
А ничего, что во втором случае нет никакого оператора "in", есть оператор for ... in ... do ? Что принципиально меняет дело? Вас не удивляет, что в числах 130 и 103 0 и 3 имеют совершенно разное значение?
А ничего, что во втором случае нет никакого оператора "in", есть оператор for ... in ... do ? Что принципиально меняет дело? Вас не удивляет, что в числах 130 и 103 0 и 3 имеют совершенно разное значение?
