Копия массива

SeiOkami 499 5 11 14

Возвращает копию массива с указанием числа элементов и начального индекса В коде есть две реализации метода: 1. КопияМассиваНаполнением - Создает пустой массив и наполняет его циклом из оригинала 2. КопияМассиваУдалениемЛишних - Создает полную копию и удаления лишние элементы А так же метод КопияМассива, который в зависимости от числа объектов массива сам выбирает один из методов


// Возвращает копию массива с указанием числа элементов и начального индекса
// Внутри есть определение метода копирования
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
// 
// Параметры:
//  Массив - Массив из Произвольный
//  НачальныйЭлемент - Число - Индекс начального элемента
//  ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
//  МетодКопирования - Число - 0 - определять автоматически, 1 - наполнение циклом, 2 - удаление лишних
// 
// Возвращаемое значение:
//  Массив из Произвольный
//
// Примеры:
//  ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
//  Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4"     - Три элемента с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 1);    //"2,3,4,5"   - Все элементы с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2"       - Первые 2 элемента
//  Результат = КопияМассива(ИсходныйМассив);       //"1,2,3,4,5" - Полная копия массива
//  
Функция КопияМассива(Знач Массив, Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0, Знач МетодКопирования = 0) Экспорт
	
	ВсегоЭлементов = Массив.Количество();
	
	Если МетодКопирования = 0 Тогда
	
		//Если массив меньше, то нет принципиально разницы в скорости
		//TODO: Определить экспериментально идеальное значение
		МинимальнаяДлинаМассиваДляПоискаМетода = 10;
		Если ВсегоЭлементов > МинимальнаяДлинаМассиваДляПоискаМетода Тогда
		
			Если ЧислоЭлементов = 0 Тогда
				ЧислоЭлементов = ВсегоЭлементов - (НачальныйЭлемент + 1);
			КонецЕсли;
			
			Если ЧислоЭлементов = 0 Тогда
				Возврат Новый Массив;
			Иначе
				ПроцентНужных = (ЧислоЭлементов / ВсегоЭлементов) * 100;
				Если ПроцентНужных > 90 Тогда
					МетодКопирования = 2; //Легче скопировать весь большой массив и удалить лишние элементы
				Иначе
					МетодКопирования = 1; //Легче взять нужные элементы из большого массива
				КонецЕсли;
			КонецЕсли;
		
		Иначе
			
			МетодКопирования = 1; //Устроит любой метод
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если МетодКопирования = 1 Тогда
		КопияМассива = КопияМассиваНаполнением(Массив, НачальныйЭлемент, ЧислоЭлементов);
	Иначе
		КопияМассива = КопияМассиваУдалениемЛишних(Массив, НачальныйЭлемент, ЧислоЭлементов);
	КонецЕсли;
	
	Возврат КопияМассива;
	
КонецФункции

// Возвращает копию массива с указанием числа элементов и начального индекса
// Создает полную копию и удаления лишние элементы
// Эффективен, когда нужно взять бОльшую часть большОго массива
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
// 
// Параметры:
//  Массив - Массив из Произвольный
//  НачальныйЭлемент - Число - Индекс начального элемента
//  ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
// 
// Возвращаемое значение:
//  Массив из Произвольный
//  
// Примеры:
//  ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
//  Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4"     - Три элемента с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 1);    //"2,3,4,5"   - Все элементы с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2"       - Первые 2 элемента
//  Результат = КопияМассива(ИсходныйМассив);       //"1,2,3,4,5" - Полная копия массива
Функция КопияМассиваУдалениемЛишних(Знач Массив, 
	Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0) Экспорт
	
	КопияМассива = Новый Массив(Новый ФиксированныйМассив(Массив));
	
	Пока НачальныйЭлемент > 0 Цикл
		КопияМассива.Удалить(0);
		НачальныйЭлемент = НачальныйЭлемент - 1;
	КонецЦикла;
	
	Если ЧислоЭлементов > 0 Тогда
		ЭлементовКУдалению = КопияМассива.Количество() - ЧислоЭлементов;
		Пока ЭлементовКУдалению > 0 Цикл
			КопияМассива.Удалить(КопияМассива.ВГраница());
			ЭлементовКУдалению = ЭлементовКУдалению - 1;
		КонецЦикла;
	КонецЕсли;
	
	Возврат КопияМассива;
	
КонецФункции

// Возвращает копию массива с указанием числа элементов и начального индекса
// Создает пустой массив и наполняет его циклом из оригинала
// Эффективен, когда нужно взять несколько элементов из оригинального большого массива
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
// 
// Параметры:
//  Массив - Массив из Произвольный
//  НачальныйЭлемент - Число - Индекс начального элемента
//  ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
// 
// Возвращаемое значение:
//  Массив из Произвольный
//  
// Примеры:
//  ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
//  Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4"     - Три элемента с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 1);    //"2,3,4,5"   - Все элементы с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2"       - Первые 2 элемента
//  Результат = КопияМассива(ИсходныйМассив);       //"1,2,3,4,5" - Полная копия массива
Функция КопияМассиваНаполнением(Знач Массив, 
	Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0) Экспорт
	
	Если ЧислоЭлементов = 0 Тогда
		ЧислоЭлементов = Массив.Количество() - НачальныйЭлемент;
	КонецЕсли;
	
	КопияМассива = Новый Массив(ЧислоЭлементов);
	
	ИндексКопии = 0;
	ИндексМассива = НачальныйЭлемент;
	
	Пока ИндексКопии < ЧислоЭлементов Цикл
		
		КопияМассива[ИндексКопии] = Массив[ИндексМассива];
		
		ИндексМассива = ИндексМассива + 1;
		ИндексКопии = ИндексКопии + 1;
		
	КонецЦикла;
	
	Возврат КопияМассива;
	
КонецФункции
0
Орфографическая ошибка в бОльшую: Ольшую
Орфографическая ошибка в большОго: больш

См. также

СвернутьМассив (БСП)

СкопироватьРекурсивно (БСП)

Удалить элемент массива

Упорядочивание (сортировка) массива

ПриПредложенииПользователюСоздатьРезервнуюКопию (БСП)

ПараметрыРезервнойКопии (БСП)

ПредложитьПользователюСоздатьРезервнуюКопию (БСП)

УдалитьРезервныеКопииПоНастройке (БСП)

Модератору