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

вывести номер искомого элемента массива

Добавлено: 15 янв 2018, 14:41
Sertik
Приветствую всех !
Элементарная задача - не знаю как решить:

Есть, например, массив данных:
:local list [:toarray "mama, papa, brat, sestra"];

Проверить элемент на вхождение в массив можно так:

:local Type "brat";
:foreach i in=$list do={ :if ($i=$Type) do={:log info "yes" } else={:log info "no";}

А как получить порядковый номер этого элемента в массиве ?

Re: вывести номер искомого элемента массива

Добавлено: 15 янв 2018, 19:01
Sertik
Ну так что никто не знает ? Наверняка просто же ? Может перебрать массив каким другим видом цикла ?
Если кто знает - подскажите, пожалуйста ...

Re: вывести номер искомого элемента массива

Добавлено: 15 янв 2018, 19:04
Sertik
Дело в том что в случае с циклом "foreach i in=" в $i находится сам элемент массива, а не счетчик прохода по циклу. А где счетчик то хранитcя ?

Re: вывести номер искомого элемента массива

Добавлено: 16 янв 2018, 13:40
Sertik
Пока ждал ответа от кого-нибудь придумал другой выход. Создается массив этих элементов с ключами-номерами к ним. Вот и все.

Re: вывести номер искомого элемента массива

Добавлено: 19 янв 2018, 14:47
vqd
Sertik писал(а):Приветствую всех !
Элементарная задача - не знаю как решить:

Есть, например, массив данных:
:local list [:toarray "mama, papa, brat, sestra"];

Проверить элемент на вхождение в массив можно так:

:local Tipe "brat";
:foreach i in=$list do={ :if ($i=$Type) do={:log info "yes" } else={:log info "no";}

А как получить порядковый номер этого элемента в массиве ?


:global list [:toarray "mama, papa, brat, sestra"];

Без циклов проверяем вхождение
:if ([:len [find key=brat in=$list ]] > 0) do={:put "Yes"} else={:put "No"}

Собственно позиция
:put [find key=brat in=$list ]

Re: вывести номер искомого элемента массива

Добавлено: 22 янв 2018, 21:50
Sertik
vqd, спасибо, большое !

Тогда уж еще вопрос к Вам, как к гуру:

Как удалить элемент из массива - не обнулить его значение, а именно удалить вместе с ключом ?

И еще вопрос - откуда Вы это знаете ? (если не секрет, конечно). Существуют ли фирменные руководства по скриптовому языку Микротик, кроме Вики ?
Можете посоветовать источник ?

Re: вывести номер искомого элемента массива

Добавлено: 22 янв 2018, 22:23
podarok66

Код: Выделить всё

{
:local list [:toarray "mama, papa, brat, sestra"];
:set list ([:pick $list 0 2] , nil , [:pick $list 3 4]);
:put $list;
}

Re: вывести номер искомого элемента массива

Добавлено: 22 янв 2018, 23:14
Sertik
podarok66: как у Вас можно, но криво как то. Нужно знать позицию элемента в массиве и придется от нее pick-ать элементы. Должно быть изящнее ...
Но все равно, спасибо ! Решение рабочее.

Re: вывести номер искомого элемента массива

Добавлено: 22 янв 2018, 23:29
Sertik
Вот так, с помощью vqd и podarok66, получилось вроде универсально:
Из массива удаляется заданный элемент. Правда, верятно, если он в массиве не повторяется.

{
:local name "brat"
:local list [:toarray "mama, papa, brat, sestra"];
:local keynum [:find key=$name in=$list]
:put $list
:set list ([:pick $list 0 [:find key=$name in=$list]] , nil , [:pick $list ([:find key=$name in=$list]+1) [:len $list]]);
:put $list;
}

Еще проверю во всех вариантах. Спасибо, друзья !

Re: вывести номер искомого элемента массива

Добавлено: 23 янв 2018, 16:18
podarok66
Sertik писал(а):Правда, верятно, если он в массиве не повторяется.

Если есть повтор, то удаляет первый из попавшихся:

Код: Выделить всё

{
:local list [:toarray "mama, papa, brat, sestra, brat"];
:local y [:len $list];                                   
:local key [:find key=brat in=$list];
:put $list;                           
:set list ([:pick $list 0 $key], nil , [:pick $list ($key + 1) $y]);
:put $list;                                                         
}         
mama;papa;brat;sestra;brat
mama;papa;sestra;brat

Тогда уж надо для удаления повторяющегося значения использовать такую связку:

Код: Выделить всё

{
:local list [:toarray "mama, papa, brat, sestra, brat"];
:put $list;                                   
:foreach i in=$list do={
:if ($i="brat") do={
:local y [:len $list];
:local key [:find key=brat in=$list];                                                     
:set list ([:pick $list 0 $key], nil , [:pick $list ($key + 1) $y]);
:put $list;}}
}     
mama;papa;brat;sestra;brat
mama;papa;sestra;brat
mama;papa;sestra                                                     

Что по поводу некрасивости моей первой конструкции, так я же вам направление решения показал, а не задачу решал в окончательном варианте...