From cb160fd3b04e21f0d3b035fc2696a8b6e42a76aa Mon Sep 17 00:00:00 2001 From: Oleg Tymko Date: Thu, 3 Jan 2019 19:03:13 +0700 Subject: [PATCH 1/2] =?UTF-8?q?=D0=A1=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\265\321\200\321\201\320\270\320\270.os" | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" index 0dafdc2..befce21 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" @@ -228,6 +228,82 @@ Возврат СравнитьВерсии(СтрокаВерсия1, СтрокаВерсия2) >= 0; КонецФункции +// Сортирует массив версий (возр или убыв) +// +// Параметры: +// ВходящиеДанные - массив данных с типом Версия / Строковое представление версии +// ПорядокСортировки - строка, принимает значение "ВОЗР" или "УБЫВ" +Процедура СортироватьВерсии(ВходящиеДанные, ПорядокСортировки = "ВОЗР") Экспорт + + Массив = ВходящиеДанные; + + КоличествоЭлементовВМассиве = Массив.Количество(); + Если КоличествоЭлементовВМассиве > 0 Тогда + БыстраяСортировка(Массив, 0, КоличествоЭлементовВМассиве - 1, ПорядокСортировки); + КонецЕсли; + + ВходящиеДанные = Массив; + +КонецПроцедуры + +Процедура БыстраяСортировка(МассивДанных, ЛевоеЗначение, ПравоеЗначение, Знач ПорядокСортировки = "ВОЗР") + + ПорядокСортировки = вРег(ПорядокСортировки); + + ЛевоеЗначениеФиксированное = ЛевоеЗначение; //левая граница + ПравоеЗначениеФиксированное = ПравоеЗначение; // правая граница + ОпорноеЗначение = МассивДанных[ЛевоеЗначение]; // значение опоры + + // пока границы не сомкнутся + Пока ЛевоеЗначение < ПравоеЗначение Цикл + + // двигаем правую границу до значения, больше(меньше) опорного + Пока ?(ПорядокСортировки = "ВОЗР", + ВерсияБольшеИлиРавны(МассивДанных[ПравоеЗначение], ОпорноеЗначение), + ВерсияМеньшеИлиРавны(МассивДанных[ПравоеЗначение], ОпорноеЗначение)) И ЛевоеЗначение < ПравоеЗначение Цикл + + ПравоеЗначение = ПравоеЗначение - 1; + + КонецЦикла; + + Если ЛевоеЗначение <> ПравоеЗначение Тогда // если границы не сомкнулись + МассивДанных[ЛевоеЗначение] = МассивДанных[ПравоеЗначение]; // перемещаем правое на левое + ЛевоеЗначение = ЛевоеЗначение + 1; // сдвигаем вправо + КонецЕсли; + + // двигаем левую границу до значения, меньше(больше) опорного + Пока ?(ПорядокСортировки = "ВОЗР", + ВерсияМеньшеИлиРавны(МассивДанных[ЛевоеЗначение], ОпорноеЗначение), + ВерсияБольшеИлиРавны(МассивДанных[ЛевоеЗначение], ОпорноеЗначение)) И ЛевоеЗначение < ПравоеЗначение Цикл + + ЛевоеЗначение = ЛевоеЗначение + 1; + + КонецЦикла; + + // если границы не сомкнулись + Если ЛевоеЗначение <> ПравоеЗначение Тогда + МассивДанных[ПравоеЗначение] = МассивДанных[ЛевоеЗначение]; // перемещаем левое на правое + ПравоеЗначение = ПравоеЗначение - 1; // сдвигаем вправо + КонецЕсли; + + КонецЦикла; + + // фиксируем + МассивДанных[ЛевоеЗначение] = ОпорноеЗначение; + ОпорноеЗначение = ЛевоеЗначение; + ЛевоеЗначение = ЛевоеЗначениеФиксированное; + ПравоеЗначение = ПравоеЗначениеФиксированное; + + // рекурсивно сортируем две части массива + Если ЛевоеЗначение < ОпорноеЗначение Тогда + БыстраяСортировка(МассивДанных, ЛевоеЗначение, ОпорноеЗначение - 1, ПорядокСортировки); + КонецЕсли; + Если ПравоеЗначение > ОпорноеЗначение Тогда + БыстраяСортировка(МассивДанных, ОпорноеЗначение + 1, ПравоеЗначение, ПорядокСортировки); + КонецЕсли; + +КонецПроцедуры + Функция ПрочитатьВерсию(Знач СтрокаВерсии) КлассВерсия = Новый Версия(СтрокаВерсии); From f5c9a5d4e1218c37e2439e19a5ac8c34cea772a6 Mon Sep 17 00:00:00 2001 From: Oleg Tymko Date: Thu, 3 Jan 2019 19:03:26 +0700 Subject: [PATCH 2/2] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BE=D1=80=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\321\200\321\201\320\270\320\270_test.os" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git "a/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" "b/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" index 85a346a..fda920f 100644 --- "a/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" +++ "b/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" @@ -16,6 +16,8 @@ // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций"); // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций"); + ИменаТестов.Добавить("ТестДолженПроверитьСортировкуВерсий"); + Возврат ИменаТестов; КонецФункции @@ -140,6 +142,62 @@ КонецПроцедуры +Процедура ТестДолженПроверитьСортировкуВерсий() Экспорт + + ЭталонСортировкиПоВозрастанию = СтрРазделить("1.0.0 1.3.0 1.4.0 1.5.0 1.9.0 1.20.0", " "); + ЭталонСортировкиПоУбыванию = СтрРазделить("1.20.0 1.9.0 1.5.0 1.4.0 1.3.0 1.0.0", " "); + + МассивДанныхПроверки = СтрРазделить("1.0.0 1.4.0 1.20.0 1.3.0 1.9.0 1.5.0", " "); + Версии.СортироватьВерсии(МассивДанныхПроверки, "ВОЗР"); + Утверждения.Проверить( + ПроверитьРавенствоМассивов(МассивДанныхПроверки, ЭталонСортировкиПоВозрастанию), + "Результат должен совпадать с ожиданиями."); + + МассивДанныхПроверки = СтрРазделить("1.0.0 1.4.0 1.20.0 1.3.0 1.9.0 1.5.0", " "); + Версии.СортироватьВерсии(МассивДанныхПроверки, "УБЫВ"); + Утверждения.Проверить( + ПроверитьРавенствоМассивов(МассивДанныхПроверки, ЭталонСортировкиПоУбыванию), + "Результат должен совпадать с ожиданиями."); + +КонецПроцедуры + +Функция МассивВерсийВСтроку(МассивДанных) + + Результат = ""; + + Для Каждого ЭлементМассива Из МассивДанных Цикл + + Значение = ?(ТипЗнч(ЭлементМассива) = Тип("Версия"), ЭлементМассива.ВСтроку(), ЭлементМассива); + Результат = Результат + ?(ПустаяСтрока(Результат), "", " ") + Значение; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПроверитьРавенствоМассивов(Массив1, Массив2) + + Если Не (ТипЗнч(Массив1) = Тип("Массив") И ТипЗнч(Массив2) = Тип("Массив")) Тогда + Возврат Ложь; + КонецЕсли; + + Если Не Массив1.Количество() = Массив2.Количество() Тогда + Возврат Ложь; + КонецЕсли; + + Для Индекс = 0 По Массив1.Количество() - 1 Цикл + + Если Не Массив1[Индекс] = Массив2[Индекс] Тогда + Возврат Ложь; + КонецЕсли; + + КонецЦикла; + + Возврат Истина; + +КонецФункции + Функция ТестовыйСлучай(Знач ВерсииПроверки, Знач Диапазон, Знач Результат) Тест = Новый Структура;