На практике часто бывает нужно работать с массивом, каждый элемент которого содержит структуру. При этом было бы хорошо иметь несколько универсальных функций, которые могли бы решать следующие задачи:
1) Поиск элемента массива структур по одному значению;
2) Поиск элемента массива структур по двум значениям;
3) Поиск минимального и максимального значения в массиве структур.
С подобной задачей можно столкнуться, например, когда мы запросом получаем информацию из базы данных, и хотим вернуть ее на клиент в виде таблицы значений. Но с таблицей значений на момент написания статьи в тонком клиенте работать нельзя. Поэтому, чтобы вернуть таблицу значений на клиент можем использовать функцию БСП “ТаблицаЗначенийВМассив”:
В результате на клиенте получаем массив, каждый элемент которого содержит структуру:
Исходные данные:
1. Учебная конфигурация;
2. Платформа 8.3.19.1150.
Решение задачи “Поиск элемента массива структур по одному значению”:
Пояснение:
В цикле обходим каждый элемент массива структур:
Во вложенном цикле обходим структуру, где “Ключ” это наименование столбца в запросе, а “Значение” его значение:
Далее проверяем, если “Ключ” равен ключу, который мы ищем, и значение равно значению, которое мы ищем, фиксирует результат и прерываем цикл.
В результате получаем:
Решение задачи “Поиск элемента массива структур по двум значениям”:
Пояснение:
В цикле обходим каждый элемент массива структур.
Если второй ключ для поиска не указан, обходим структуру текущего элемента массива и проверяем, есть ли в ней нужное значение.
Если второй ключ для поиска указан, в переменные “ЗначениеСтруктуры” и “ЗначениеСтруктуры2” помещаем соответствующие значения искомых ключей и сравниваем их с искомыми значениями:
В результате получаем:
Решение задачи “Поиск минимального и максимального значения в массиве структур”:
Пояснение:
В цикле обходим элементы массива. Во вложенном цикле обходим структуру и сравниваем минимальное значение со значением в текущей итерации.
В результате получаем:
Аналогичным образом ищем максимальное значение:
В результате получаем:
Ссылки для скачивания:
- Поиск элемента массива структур по одному значению;
- Поиск элемента массива структур по двум значениям;
- Поиск минимального значения в массиве структур;
- Поиск максимального значения в массиве структур.
2022-05-23 11:58
Программирование
Поиск по массиву структур |
Я |
10.06.13 – 10:50
Добрый день! Скажите пожалуйста, как правильно искать значение по массиву структур? Простым Найти ничего не находит. Вот структура:
СтруктураЗаписейРазговоров.Вставить(“Channel”, КлючСтруктуры);
СтруктураЗаписейРазговоров.Вставить(“Value”, ЗаписьРазговора);
МассивЗаписейРазговоров.Добавить(СтруктураЗаписейРазговоров);
Как в ней найти значение Value по ключу Channel ?
1 – 10.06.13 – 10:51
только циклом, а почему вам не использовать соответствие?
2 – 10.06.13 – 10:52
(1) а как использовать соотвествие?
3 – 10.06.13 – 10:54
&НаСервере
Функция ПолучитьПодразделение_(КодСклада)
соо=Новый Соответствие;
соо.Вставить(“Б0137”, “00-000020”);
соо.Вставить(“Б0132”, “00-000019”);
соо.Вставить(“Б0050”, “00-000017”);
Возврат Справочники.ПодразделенияОрганизаций.НайтиПоКоду(соо[КодСклада]);
КонецФункции
4 – 10.06.13 – 10:58
(3) что-то я не пойму, т.е. я должна знать значение Value?
5 – 10.06.13 – 11:00
(4) ты должна знать ключ (который называла Channel)
6 – 10.06.13 – 11:01
Функция ПолучитьПодразделение_(Channel)
соо=Новый Соответствие;
соо.Вставить(“Б0137”, “00-000020”);
соо.Вставить(“Б0132”, “00-000019”);
соо.Вставить(“Б0050”, “00-000017”);
Возврат соо[Channel];
КонецФункции
7 – 10.06.13 – 11:01
(0) Использование таблиц значений в вашей религии запрещено?
8 – 10.06.13 – 11:01
+(6) Функция ПолучитьValue(Channel)
9 – 10.06.13 – 11:02
+(7) Зато поощряется использование идентификаторов на латинице
10 – 10.06.13 – 11:02
ПолучитьValue… Это надо запомнить
11 – 10.06.13 – 11:02
(8) подожди, а откуда я возьму все эти значения, которые ты указал в своем соотвествии ?
12 – 10.06.13 – 11:05
(11) подожди, в чем задача вообще? ))
13 – 10.06.13 – 11:13
14 – 10.06.13 – 11:14
15 – 10.06.13 – 12:37
(13) а откуда эта функция берется
Если Вычислить(Условие) Тогда
16 – 10.06.13 – 12:43
(15)+ Вообще можешь
Например
Процедура СкопироватьПоУсловию(Тз,Условие)
резулт=Тз.СкопироватьКолонки();
Для каждого Стр из Тз Цикл
Если Вычислить(Условие) Тогда
РезСтр=Резулт.Добавить();
ЗаполнитьЗначенияСвойств(РезСтр,стр);
КонецЕсли;
КонецЦЦикла
возврат резулт
КонецФункции
17 – 10.06.13 – 13:30
(16) К сожалению в 1С нет ни лямбд ни делегатов
но есть функция вычислить, которая выполняет текст
Функция НайтиПоУсловию(Тз,Условие,Список=””,Модуль=””)
Массив новый массив;
Для каждого Стр из Тз Цикл
Если Вычислить(Условие) Тогда
массив.Добавить(стр)
КонецЕсли
КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции
Рез=НайтиПоУсловию(тз,”стр.ФизЛицо=””Иванов””
или стр.ФизЛицо=””Сидоров””
или стр.ФизЛицо=””Петров”””);
или
Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок(“Иванов,Сидоров,Петров”);
Рез=НайтиПоУсловию(тз,”Список.Найти(стр.ФизЛицо)<>Неопределено”);
Или
Рез=НайтиПоУсловию(тз,”Найти(Врег(стр.Значение),Врег(“”акф””))>0″);
Рез=НайтиПоУсловию(тз,”Модуль.ФункцияСравнения(Стр,Список)”,ЭтотОбъект);
То есть в модуле обработки должна быть функция
Функция ФункцияСравнения(стр,МассивСтруктур) Экспорт
18 – 10.06.13 – 13:32
17 В данном примере Вычислить обрабатывает строку с условием Условие учитывая переменные Стр,тз,Список,Модуль
19 – 10.06.13 – 13:34
(0)Структура (Structure)
Свойство (Property)
Возвращаемое значение:
Тип: Булево.
Истина – ключ найден; Ложь – в противном случае.
не оно ?
20 – 10.06.13 – 13:34
Прошу прощения не в тему. Что то перегрелся.
21 – 10.06.13 – 14:10
(3) а если я буду использовать соответствие, то смогу найти значение Value?
22 – 10.06.13 – 14:50
(21) ЗаписьРазговора = Соответствие.Получить(КлючСтруктуры);
23 – 10.06.13 – 14:53
(22) а массив тогда вообще не нужен что ли?
24 – 10.06.13 – 14:59
(23) Соответствие – это замена массиву структур. И правильнее, и проще, и быстрее работает.
25 – 10.06.13 – 15:00
(24) Спасибо большое! Я уже сама это начала понимать
AnisaL
26 – 10.06.13 – 15:15
Спасибо всем), разобралась с этими соответствиями и структурами
Добрый день! Скажите пожалуйста, как правильно искать значение по массиву структур? Простым Найти ничего не находит. Вот структура: МассивЗаписейРазговоров.Добавить(СтруктураЗаписейРазговоров); Как в ней найти значение Value по ключу Channel ?
только циклом, а почему вам не использовать соответствие?
а как использовать соотвествие?
что-то я не пойму, т.е. я должна знать значение Value?
ты должна знать ключ (который называла Channel)
Использование таблиц значений в вашей религии запрещено?
+ Функция ПолучитьValue(Channel)
+ Зато поощряется использование идентификаторов на латинице
ПолучитьValue… Это надо запомнить
подожди, а откуда я возьму все эти значения, которые ты указал в своем соотвествии ?
подожди, в чем задача вообще? ))
а откуда эта функция берется Если Вычислить(Условие) Тогда
+ Вообще можешь КонецФункции
К сожалению в 1С нет ни лямбд ни делегатов но есть функция вычислить, которая выполняет текст Функция НайтиПоУсловию(Тз,Условие,Список=””,Модуль=””) Массив новый массив; Или То есть в модуле обработки должна быть функция
17 В данном примере Вычислить обрабатывает строку с условием Условие учитывая переменные Стр,тз,Список,Модуль
Возвращаемое значение: Тип: Булево. Истина – ключ найден; Ложь – в противном случае. не оно ?
Прошу прощения не в тему. Что то перегрелся.
а если я буду использовать соответствие, то смогу найти значение Value?
ЗаписьРазговора = Соответствие.Получить(КлючСтруктуры);
а массив тогда вообще не нужен что ли?
Соответствие – это замена массиву структур. И правильнее, и проще, и быстрее работает.
Спасибо большое! Я уже сама это начала понимать
Спасибо всем), разобралась с этими соответствиями и структурами
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
// control.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #include <fstream> #include <Windows.h> #include <string.h> using namespace std; const int NotUsed = system( "color F0" ); struct student { char lastname[30]; char firstname[30]; char street[30]; int house; int apartment; }mas; int _tmain(int argc, _TCHAR* argv[]) { int option = 0; while(option != -1) { cout<<endl<<"1 - Make 2 - Print 3 - Save 4 - Load 5 - Sort 6 - Find 0 - Exit"<<endl; cout<<"Input Num "; cin >> option; switch(option) { case 1: cout <<endl<<"Make"<<endl; int i; struct student mas[10]; strcpy_s(mas[0].lastname, "Anisimov"); strcpy_s(mas[0].firstname, "Anton"); strcpy_s(mas[0].street, "Budanuva"); mas[0].house=10; mas[0].apartment=3; strcpy_s(mas[1].lastname, "Bunin"); strcpy_s(mas[1].firstname, "Pavel"); strcpy_s(mas[1].street, "Oboronu"); mas[1].house=20; mas[1].apartment=5; strcpy_s(mas[2].lastname, "Cuprin"); strcpy_s(mas[2].firstname, "Vasiliy"); strcpy_s(mas[2].street, "Lesnaay"); mas[2].house=15; mas[2].apartment=8; strcpy_s(mas[3].lastname, "Dostoevskiy"); strcpy_s(mas[3].firstname, "Igor"); strcpy_s(mas[3].street, "Globova"); mas[3].house=1; mas[3].apartment=15; strcpy_s(mas[4].lastname, "Esenin"); strcpy_s(mas[4].firstname, "Evgeniy"); strcpy_s(mas[4].street, "Respublikanskay"); mas[4].house=56; mas[4].apartment=5; strcpy_s(mas[5].lastname, "Bach"); strcpy_s(mas[5].firstname, "Anton"); strcpy_s(mas[5].street, "Chmelnaay"); mas[5].house=11; mas[5].apartment=88; strcpy_s(mas[6].lastname, "Pushkin"); strcpy_s(mas[6].firstname, "Aleksandr"); strcpy_s(mas[6].street, "Rechnaay"); mas[6].house=132; mas[6].apartment=33; strcpy_s(mas[7].lastname, "Nosov"); strcpy_s(mas[7].firstname, "Nikolay"); strcpy_s(mas[7].street, "Treugolnaay"); mas[7].house=16; mas[7].apartment=81; strcpy_s(mas[8].lastname, "Ostrovskiy"); strcpy_s(mas[8].firstname, "Igor"); strcpy_s(mas[8].street, "Komarskaay"); mas[8].house=19; mas[8].apartment=8; strcpy_s(mas[9].lastname, "Asprin"); strcpy_s(mas[9].firstname, "Robert"); strcpy_s(mas[9].street, "Snezhnaay"); mas[9].house=6; mas[9].apartment=24; for (i=0;i<10;i++) cout<<""<<mas[i].lastname<<" "<<mas[i].firstname<<" st. "<<mas[i].street<<" "<<mas[i].house<<", ap."<<mas[i].apartment<<endl; break; case 2: cout <<endl<<"Print"<<endl; for(i=0;i<10;i++) cout<<""<<mas[i].lastname<<" "<<mas[i].firstname<<" st. "<<mas[i].street<<" "<<mas[i].house<<", ap."<<mas[i].apartment<<endl; break; case 3: cout <<endl<<"Save"<<endl; { ofstream outfile; outfile.open("outfile.txt"); for (i=0;i<10;++i) outfile << mas[i].lastname << " " << mas[i].firstname << " st. " << mas[i].street << " " << mas[i].house << ", ap. " << mas[i].apartment <<endl; outfile.close(); } break; case 4: cout <<endl<<"Load"<<endl; {char buff[100]; ifstream fin("outfile.txt"); for (i=0;i<10;i++) { fin.getline(buff, 100); cout << buff<<endl; } fin.close(); } break; case 5: cout <<endl<<"Sort"<<endl; int j; char mas2[30]; char mas3[30]; char mas4[30]; int mas5; int mas6; for(i=0;i<10-1;i++) for(j=i+1;j<10;j++) if(strcmp(mas[i].lastname,mas[j].lastname)>0) {strcpy_s(mas2,mas[i].lastname); strcpy_s(mas3,mas[i].firstname); strcpy_s(mas4,mas[i].street); swap(mas[i].house,mas5); swap(mas[i].apartment,mas6); strcpy_s(mas[i].lastname,mas[j].lastname); strcpy_s(mas[i].firstname,mas[j].firstname); strcpy_s(mas[i].street,mas[j].street); swap(mas[i].house,mas[j].house); swap(mas[i].apartment,mas[j].apartment); strcpy_s(mas[j].lastname,mas2); strcpy_s(mas[j].firstname,mas3); strcpy_s(mas[j].street,mas4); swap(mas[j].house,mas5); swap(mas[j].apartment,mas6); } for(i=0;i<10;i++) cout<<mas[i].lastname<<" "<<mas[i].firstname<<" st. "<<mas[i].street<<" "<<mas[i].house<<", ap."<<mas[i].apartment<<endl; break; case 6: cout <<endl<<"Find"<<endl; break; case 0: return 0; default: cout <<endl<<"Error"<<endl; } } system("pause"); return 0; } |
Выполняет поиск элемента в массиве.
Синтаксис
Метод Найти()
имеет следующий синтаксис:
число Найти(Значение)
А также альтернативный англоязычный синтаксис:
number Find(Value)
Параметры
Описание параметров метода Найти()
:
Имя параметра* | Тип | Описание |
---|---|---|
Значение | Произвольный | Значение, которое нужно найти |
*Жирным шрифтом выделены обязательные параметры |
Возвращаемое значение
Число |
— индекс первого найденного элемента массива |
Неопределено |
— если элемент не был найден |
Описание
Метод Найти()
выполняет поиск заданного элемента в массиве. Если элемент не найден, метод возвращает Неопределено.
Важно! Метод эффективно использовать для поиска уникальных значений
Доступность
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример использования
Пример кода с использованием метода Найти()
:
м = Новый Массив; ... элт = м.Найти(1); Если элт = Неопределено Тогда м.Добавить(1); КонецЕсли; элт = м.Найти(2); Если элт = Неопределено Тогда м.Добавить(2); КонецЕсли; ...
Поделиться страницей в соц.сетях