Skip to content

Commit 29e747e

Browse files
authored
Merge pull request #4 from otymko/develop
Сортировка версий в массиве
2 parents 9fae68f + d56c65d commit 29e747e

File tree

2 files changed

+134
-0
lines changed

2 files changed

+134
-0
lines changed

src/core/Модули/Версии.os

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,82 @@
228228
Возврат СравнитьВерсии(СтрокаВерсия1, СтрокаВерсия2) >= 0;
229229
КонецФункции
230230

231+
// Сортирует массив версий (возр или убыв)
232+
//
233+
// Параметры:
234+
// ВходящиеДанные - массив данных с типом Версия / Строковое представление версии
235+
// ПорядокСортировки - строка, принимает значение "ВОЗР" или "УБЫВ"
236+
Процедура СортироватьВерсии(ВходящиеДанные, ПорядокСортировки = "ВОЗР") Экспорт
237+
238+
Массив = ВходящиеДанные;
239+
240+
КоличествоЭлементовВМассиве = Массив.Количество();
241+
Если КоличествоЭлементовВМассиве > 0 Тогда
242+
БыстраяСортировка(Массив, 0, КоличествоЭлементовВМассиве - 1, ПорядокСортировки);
243+
КонецЕсли;
244+
245+
ВходящиеДанные = Массив;
246+
247+
КонецПроцедуры
248+
249+
Процедура БыстраяСортировка(МассивДанных, ЛевоеЗначение, ПравоеЗначение, Знач ПорядокСортировки = "ВОЗР")
250+
251+
ПорядокСортировки = вРег(ПорядокСортировки);
252+
253+
ЛевоеЗначениеФиксированное = ЛевоеЗначение; //левая граница
254+
ПравоеЗначениеФиксированное = ПравоеЗначение; // правая граница
255+
ОпорноеЗначение = МассивДанных[ЛевоеЗначение]; // значение опоры
256+
257+
// пока границы не сомкнутся
258+
Пока ЛевоеЗначение < ПравоеЗначение Цикл
259+
260+
// двигаем правую границу до значения, больше(меньше) опорного
261+
Пока ?(ПорядокСортировки = "ВОЗР",
262+
ВерсияБольшеИлиРавны(МассивДанных[ПравоеЗначение], ОпорноеЗначение),
263+
ВерсияМеньшеИлиРавны(МассивДанных[ПравоеЗначение], ОпорноеЗначение)) И ЛевоеЗначение < ПравоеЗначение Цикл
264+
265+
ПравоеЗначение = ПравоеЗначение - 1;
266+
267+
КонецЦикла;
268+
269+
Если ЛевоеЗначение <> ПравоеЗначение Тогда // если границы не сомкнулись
270+
МассивДанных[ЛевоеЗначение] = МассивДанных[ПравоеЗначение]; // перемещаем правое на левое
271+
ЛевоеЗначение = ЛевоеЗначение + 1; // сдвигаем вправо
272+
КонецЕсли;
273+
274+
// двигаем левую границу до значения, меньше(больше) опорного
275+
Пока ?(ПорядокСортировки = "ВОЗР",
276+
ВерсияМеньшеИлиРавны(МассивДанных[ЛевоеЗначение], ОпорноеЗначение),
277+
ВерсияБольшеИлиРавны(МассивДанных[ЛевоеЗначение], ОпорноеЗначение)) И ЛевоеЗначение < ПравоеЗначение Цикл
278+
279+
ЛевоеЗначение = ЛевоеЗначение + 1;
280+
281+
КонецЦикла;
282+
283+
// если границы не сомкнулись
284+
Если ЛевоеЗначение <> ПравоеЗначение Тогда
285+
МассивДанных[ПравоеЗначение] = МассивДанных[ЛевоеЗначение]; // перемещаем левое на правое
286+
ПравоеЗначение = ПравоеЗначение - 1; // сдвигаем вправо
287+
КонецЕсли;
288+
289+
КонецЦикла;
290+
291+
// фиксируем
292+
МассивДанных[ЛевоеЗначение] = ОпорноеЗначение;
293+
ОпорноеЗначение = ЛевоеЗначение;
294+
ЛевоеЗначение = ЛевоеЗначениеФиксированное;
295+
ПравоеЗначение = ПравоеЗначениеФиксированное;
296+
297+
// рекурсивно сортируем две части массива
298+
Если ЛевоеЗначение < ОпорноеЗначение Тогда
299+
БыстраяСортировка(МассивДанных, ЛевоеЗначение, ОпорноеЗначение - 1, ПорядокСортировки);
300+
КонецЕсли;
301+
Если ПравоеЗначение > ОпорноеЗначение Тогда
302+
БыстраяСортировка(МассивДанных, ОпорноеЗначение + 1, ПравоеЗначение, ПорядокСортировки);
303+
КонецЕсли;
304+
305+
КонецПроцедуры
306+
231307
Функция ПрочитатьВерсию(Знач СтрокаВерсии)
232308

233309
КлассВерсия = Новый Версия(СтрокаВерсии);

tests/Версии_test.os

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
// ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций");
1717
// ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций");
1818

19+
ИменаТестов.Добавить("ТестДолженПроверитьСортировкуВерсий");
20+
1921
Возврат ИменаТестов;
2022

2123
КонецФункции
@@ -140,6 +142,62 @@
140142

141143
КонецПроцедуры
142144

145+
Процедура ТестДолженПроверитьСортировкуВерсий() Экспорт
146+
147+
ЭталонСортировкиПоВозрастанию = СтрРазделить("1.0.0 1.3.0 1.4.0 1.5.0 1.9.0 1.20.0", " ");
148+
ЭталонСортировкиПоУбыванию = СтрРазделить("1.20.0 1.9.0 1.5.0 1.4.0 1.3.0 1.0.0", " ");
149+
150+
МассивДанныхПроверки = СтрРазделить("1.0.0 1.4.0 1.20.0 1.3.0 1.9.0 1.5.0", " ");
151+
Версии.СортироватьВерсии(МассивДанныхПроверки, "ВОЗР");
152+
Утверждения.Проверить(
153+
ПроверитьРавенствоМассивов(МассивДанныхПроверки, ЭталонСортировкиПоВозрастанию),
154+
"Результат должен совпадать с ожиданиями.");
155+
156+
МассивДанныхПроверки = СтрРазделить("1.0.0 1.4.0 1.20.0 1.3.0 1.9.0 1.5.0", " ");
157+
Версии.СортироватьВерсии(МассивДанныхПроверки, "УБЫВ");
158+
Утверждения.Проверить(
159+
ПроверитьРавенствоМассивов(МассивДанныхПроверки, ЭталонСортировкиПоУбыванию),
160+
"Результат должен совпадать с ожиданиями.");
161+
162+
КонецПроцедуры
163+
164+
Функция МассивВерсийВСтроку(МассивДанных)
165+
166+
Результат = "";
167+
168+
Для Каждого ЭлементМассива Из МассивДанных Цикл
169+
170+
Значение = ?(ТипЗнч(ЭлементМассива) = Тип("Версия"), ЭлементМассива.ВСтроку(), ЭлементМассива);
171+
Результат = Результат + ?(ПустаяСтрока(Результат), "", " ") + Значение;
172+
173+
КонецЦикла;
174+
175+
Возврат Результат;
176+
177+
КонецФункции
178+
179+
Функция ПроверитьРавенствоМассивов(Массив1, Массив2)
180+
181+
Если Не (ТипЗнч(Массив1) = Тип("Массив") И ТипЗнч(Массив2) = Тип("Массив")) Тогда
182+
Возврат Ложь;
183+
КонецЕсли;
184+
185+
Если Не Массив1.Количество() = Массив2.Количество() Тогда
186+
Возврат Ложь;
187+
КонецЕсли;
188+
189+
Для Индекс = 0 По Массив1.Количество() - 1 Цикл
190+
191+
Если Не Массив1[Индекс] = Массив2[Индекс] Тогда
192+
Возврат Ложь;
193+
КонецЕсли;
194+
195+
КонецЦикла;
196+
197+
Возврат Истина;
198+
199+
КонецФункции
200+
143201
Функция ТестовыйСлучай(Знач ВерсииПроверки, Знач Диапазон, Знач Результат)
144202

145203
Тест = Новый Структура;

0 commit comments

Comments
 (0)