Страница 1 из 1

(решено) Оператор in - вопрос

СообщениеДобавлено: 03.09.2015 23:05:50
vitaly_l
Всем хорошего дня.
( в поиске IN найти очень сложно, не ругайтесь пожалуйста )

if ('a' in ['b','c','d']) then ... <== вот так работает.
if ('aq' in ['bq','cq','dq']) then ... <== вот так уже не работает(ругается).
if ('sdfgs' in arraySomeStrings ) then ... <== вот так тоже не работает(ругается).

В оператор in можно ли сверять массив?
В оператор in можно ли сверять строки, как в MySQL или только char?
Или я вообще неправильно его пытаюсь использовать и там сверяется что-то другое?
спасибо.

Re: Оператор in - вопрос

СообщениеДобавлено: 03.09.2015 23:15:49
pupsik
А что в вашем понимании "сверяется"?
Если сравнение то это описано и в книгах, и на просторах (comparestr)). Если вам необходим поиск то и сие аналогично (pos).

Re: Оператор in - вопрос

СообщениеДобавлено: 03.09.2015 23:37:40
vitaly_l
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)

Re: Оператор in - вопрос

СообщениеДобавлено: 04.09.2015 01:01:34
Ichthyander
Оператор in проверяет есть элемент A в множестве B, то есть A in B
В первом случае '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...)

Re: Оператор in - вопрос

СообщениеДобавлено: 04.09.2015 01:09:26
vitaly_l
Ichthyander писал(а):Во втором и третьем элементы - строки.


Добавлено спустя 12 минут 24 секунды:
Нет.. всё равно строку он не даёт вставить в множество. Только byte или char или свой набор.
строку он мне не даёт проверять в множестве... Компилятор ругается, F9 не запускает...
Код: Выделить всё

type
TMyEnumStr = set of string;
TMyEnumInt = set of integer;


Я чего-то не так делаю? или ему запрещено больше байта?

.

Re: Оператор in - вопрос

СообщениеДобавлено: 04.09.2015 06:11:43
Ichthyander
Integer не может быть множеством (слишком диапазон большой для этого).
Наборы строк непосредственно также не могут быть множеством. В своем первом посте, где я написал во втором и третьем случае строки это означало, что во втором и третьем случае именно строки, а не множества. Просто меня не так поняли: для меня строки уже естественным образом не являются множеством, поэтому не уточнил )
Но если Вам просто нужны именованные множества, то можно сделать так, как я описал выше, присвоив элементам множества осмысленные названия, к примеру, перечислимый метод цветов: 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 элементов являются ограничением множества. Но как правило для множество больше и не надо

Re: Оператор in - вопрос

СообщениеДобавлено: 04.09.2015 08:05:37
Снег Север
Как верно написали выше - во всех версиях Паскаля множества ограничены перечисляемыми типами (читать руководство, что это такое) т.е. 0..255. Строки не могут быть перечисляемыми типами. Символы могут быть - только только в однобайтовой кодировке.

ЗЫ. Если необходимо работать с набором объектов аналогично множеству (включение, объединение, пересечение), то используют дополнительные библиотеки, например, широко известную DeCAL.

Re: Оператор in - вопрос

СообщениеДобавлено: 04.09.2015 13:28:46
vitaly_l
Ichthyander писал(а):255 элементов являются ограничением множества. Но как правило для множество больше и не надо

Снег Север писал(а):во всех версиях Паскаля множества ограничены перечисляемыми типами (читать руководство, что это такое) т.е. 0..255.

Снег Север писал(а):используют дополнительные библиотеки, например, широко известную DeCAL.

Я просто подумал что в Паскале IN равнозначен IN в MySQL. Но я ошибся. Там можно динамически набрать много ID и потом при помощи IN выявить и загрузить нужные. Подключать библиотеку - это на мой взгляд здесь лишнее, т.к. можно другими стандартными способами решить задачу.
Большое всем спасибо! Вопрос решён.

Re: (решено) Оператор in - вопрос

СообщениеДобавлено: 05.09.2015 10:54:03
Снег Север
Снег Север писал(а):во всех версиях Паскаля множества ограничены перечисляемыми типами

Оказывается, я неправ - в новой среде разработки PascalABC.NET множества расширили до любого типа, включая строки и классы.

Re: (решено) Оператор in - вопрос

СообщениеДобавлено: 05.09.2015 12:44:02
vitaly_l
Снег Север писал(а): в новой среде разработки PascalABC.NET множества расширили до любого типа, включая строки и классы.

Это в Лазарусе есть? Если нет, то нужно ждать, рано или поздно, эту фишечку подключат. Хотя можно попробовать написать разработчикам.

Re: (решено) Оператор in - вопрос

СообщениеДобавлено: 05.09.2015 16:33:29
Снег Север
vitaly_l писал(а):Это в Лазарусе есть?
Нету. PascalABC.NET использует возможности dotnet, там такое реализуется очень просто.

Re: (решено) Оператор in - вопрос

СообщениеДобавлено: 05.09.2015 21:11:16
vitaly_l
Вот в другой ветке нарыл, если кому понадобится, вот так с IN работают: и string, и array (может кому понадобится):
Код: Выделить всё

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 - работает по разному...


.

Re: (решено) Оператор in - вопрос

СообщениеДобавлено: 06.09.2015 08:26:29
Снег Север
Какая неожиданность! :lol:
А ничего, что во втором случае нет никакого оператора "in", есть оператор for ... in ... do ? Что принципиально меняет дело? Вас не удивляет, что в числах 130 и 103 0 и 3 имеют совершенно разное значение?