Skip to content

Commit 1e4b7d8

Browse files
committed
Сортировка
1 parent 005bccf commit 1e4b7d8

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

src/Классы/Поток.os

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,25 @@
7979

8080
КонецФункции
8181

82+
Функция Сортировать(Знач ОписаниеОповещения = Неопределено) Экспорт
83+
84+
Если ОписаниеОповещения = Неопределено Тогда
85+
ОписаниеОповещения = СтандартныйОбработчикСравнения();
86+
КонецЕсли;
87+
88+
Лог.Отладка("Сортировать %1", ОписаниеОповещения.ИмяПроцедуры);
89+
90+
ДополнительныеПараметры = Новый Структура;
91+
ДополнительныеПараметры.Вставить("Обработчик", ОписаниеОповещения);
92+
93+
Ячейка = ОписанияОповещений.Создать("ВыполнитьСортировать", ЭтотОбъект, ДополнительныеПараметры);
94+
95+
Конвейер.Добавить(Ячейка);
96+
97+
Возврат ЭтотОбъект;
98+
99+
КонецФункции
100+
82101
// Терминальные методы
83102

84103
Функция ВМассив() Экспорт
@@ -173,6 +192,62 @@
173192

174193
КонецПроцедуры
175194

195+
Процедура ВыполнитьСортировать(Результат, ДополнительныеПараметры) Экспорт
196+
197+
Обработчик = ДополнительныеПараметры.Обработчик;
198+
199+
Лог.Отладка("ВыполнитьСортировать %1", Обработчик.ИмяПроцедуры);
200+
201+
Результат = Коллекция;
202+
203+
Если Обработчик.ДополнительныеПараметры = Неопределено Тогда
204+
Обработчик.ДополнительныеПараметры = Новый Структура;
205+
КонецЕсли;
206+
Обработчик.ДополнительныеПараметры.Вставить("Элемент1");
207+
Обработчик.ДополнительныеПараметры.Вставить("Элемент2");
208+
209+
Для й = 0 По Результат.Количество() - 1 Цикл
210+
Флаг = Ложь;
211+
к = Результат.Количество() - 1;
212+
Пока к > й Цикл
213+
Элемент = Результат[к - 1];
214+
СледующийЭлемент = Результат[к];
215+
Обработчик.ДополнительныеПараметры.Элемент1 = Элемент;
216+
Обработчик.ДополнительныеПараметры.Элемент2 = СледующийЭлемент;
217+
РезультатСортировки = Неопределено;
218+
ОписанияОповещений.ВыполнитьОбработкуОповещения(Обработчик, РезультатСортировки);
219+
Если РезультатСортировки > 0 Тогда
220+
Результат[к - 1] = СледующийЭлемент;
221+
Результат[к] = Элемент;
222+
Флаг = Истина;
223+
КонецЕсли;
224+
к = к - 1;
225+
КонецЦикла;
226+
Если НЕ Флаг Тогда
227+
Прервать;
228+
КонецЕсли;
229+
КонецЦикла;
230+
231+
КонецПроцедуры
232+
233+
Процедура ОбработчикСравнения(РезультатСортировки, ДополнительныеПараметры) Экспорт
234+
Элемент1 = ДополнительныеПараметры.Элемент1;
235+
Элемент2 = ДополнительныеПараметры.Элемент2;
236+
237+
Если Элемент1 = Элемент2 Тогда
238+
РезультатСортировки = 0;
239+
ИначеЕсли Элемент1 > Элемент2 Тогда
240+
РезультатСортировки = 1;
241+
Иначе
242+
РезультатСортировки = -1;
243+
КонецЕсли;
244+
КонецПроцедуры
245+
246+
Функция СтандартныйОбработчикСравнения()
247+
ФункцияСравнения = ОписанияОповещений.Создать("ОбработчикСравнения", ЭтотОбъект);
248+
Возврат ФункцияСравнения;
249+
КонецФункции
250+
176251
Процедура ПройтиКонвейер()
177252

178253
Лог.Отладка("Прохожу по конвейеру");

test.os

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,11 @@
3636

3737
Для Каждого Элемент Из Результат Цикл
3838
Сообщить(Элемент);
39-
КонецЦикла
39+
КонецЦикла;
40+
41+
Стрим = Потоки.ИзКоллекции(Массив);
42+
Результат = Стрим.Сортировать().ВМассив();
43+
44+
Для Каждого Элемент Из Результат Цикл
45+
Сообщить(Элемент);
46+
КонецЦикла;

0 commit comments

Comments
 (0)