Имя: Пароль:
1C
 
Удаление элементов массива
0 pro3ri
 
25.05.15
11:47
Доброго дня!

Удаляю элементы массива М, причем все четные добавленные элементы:

Процедура Сделать(Команда)
    М=Новый Массив;
    Удаляем = Новый Массив;
    Для Сч = 1 по 10 Цикл
        
        М.Добавить(Сч*100);
        
    КонецЦикла;
    
    Для Сч = 1 По М.Количество() Цикл
    
        Если Сч%2 = 0 Тогда
            
            Удаляем.Добавить(Сч -1);
            
        КонецЕсли;        
    
    КонецЦикла;
    
    Для Сч = 1 по Удаляем.Количество() Цикл
        НахождениеМаксЗн = Удаляем[Удаляем.Количество()-1];
        М.Удалить(НахождениеМаксЗн);
        Удаляем.Удалить(Удаляем.Количество()-1);
    КонецЦикла;
    
КонецПроцедуры

по моему это можно сделать проще, не?
1 cw014
 
25.05.15
11:51
????
2 cw014
 
25.05.15
11:51
А нельзя с конца пробежаться по массиву и удалить все, что %2???
3 ДенисЧ
 
25.05.15
11:52
А просто добавить нужные элементы в новый массив?
4 cw014
 
25.05.15
11:53
(3) +1
5 ЧеловекДуши
 
25.05.15
11:54
(0) Ужас, иди с конца.
Либо при удалении не двигай счетчик вперед.

"Код из разряда ГУАНО.", перепиши :)
...при удалении элемента массива, все следующие по порядку, как бы сдвигаются...
6 Goggy
 
25.05.15
11:54
(3) Да как ты посмел такое предложить? Надо оперативу экономить. Кризис в стране как никак...
7 ЧеловекДуши
 
25.05.15
11:55
(6) В какой стране? В России нормально. :)
8 pro3ri
 
25.05.15
12:07
так заработало:
    М=Новый Массив;
    Для Сч = 1 по 10 Цикл
        
        М.Добавить(Сч*100);
        
    КонецЦикла;
    А = 0;
    Для Сч = 1 По М.Количество() Цикл
        
        Если Сч%2 = 0 Тогда
            А = 1+А;
            М.Удалить(М.Количество()-1-А);
            
        КонецЕсли;        
    
    КонецЦикла;
9 pro3ri
 
25.05.15
12:08
есть более красивый вариант?
10 Asmody
 
25.05.15
12:14
(9) Слушай (3) или купи гуся
11 D_E_S_131
 
25.05.15
12:16
(9) Последнее время все чаще появляются такие вопросы. Может ВР-у создать раздел "Для эстетов"?
12 fisher
 
25.05.15
12:17
Уже предлагали более красивые варианты.
Самый простой и эффективный - в (3).

Если таки нужен обход с конца, я типа такого пишу:
Для ОтрицательныйИндекс = -М.Количество + 1 По 0 Цикл
   а = М[-ОтрицательныйИндекс];
КонецЦикла;
13 Timon1405
 
25.05.15
12:17
(0)
Всего = М.ВГраница();
Для Сч = -Всего По 0  Цикл
    Если Сч%2=-1 Тогда
        М.Удалить(-Сч)
    КонецЕсли;
КонецЦикла;
14 pro3ri
 
25.05.15
12:27
спасибо!
15 Asmody
 
25.05.15
12:37
на 3 минуты делов:

?
&НаКлиенте
Процедура Команда1(Команда)
    Массив = МассивСлучайных(20);    
    Сообщить("Исходный");
    СообщитьМассив(Массив);
    Четные = МассивФильтровать(Массив, "Четное");
    Сообщить("Четные");
    СообщитьМассив(Четные);
    Нечетные = МассивФильтровать(Массив, "Нечетное");
    Сообщить("Нечетные");
    СообщитьМассив(Нечетные);
КонецПроцедуры

&НаКлиенте
Процедура СообщитьМассив(Знач Масс)
    Для Каждого зз из Масс Цикл
        Сообщить(зз);
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Функция МассивСлучайных(Сколько=10)
    _гсч=Новый ГенераторСлучайныхЧисел;
    _м=Новый Массив();
    Для ии=1 по Сколько Цикл
        _м.Добавить(_гсч.СлучайноеЧисло(0,100));
    КонецЦикла;
    Возврат _м;
КонецФункции

&НаКлиенте
Функция МассивФильтровать(Знач Исходный, Знач ФильтрФ)
    _м = Новый Массив;
    Для Каждого зз Из Исходный Цикл
        Если Вычислить(ФильтрФ + "(зз)") Тогда
            _м.Добавить(зз);
        КонецЕсли;
    КонецЦикла;
    Возврат _м;
КонецФункции

&НаКлиенте
Функция Четное(к)
    Возврат 0 = к % 2;
КонецФункции

&НаКлиенте
Функция Нечетное(к)
    Возврат 1 = к % 2;
КонецФункции
16 D_E_S_131
 
25.05.15
12:39
(15) Вот она истинная красота!
17 fisher
 
25.05.15
12:40
Подчеркивания глаза режут. В чем их смысл?
18 1Сергей
 
25.05.15
12:41
(15) (17) у Асмодея мозги не под 1С заточены. Инфа 100%
19 fisher
 
25.05.15
12:42
И насчет "Знач" и Вычислить() - я бы не стал.
20 fisher
 
25.05.15
12:49
(18) Как в том анекдоте, чтобы руку не сбивать? :)
21 Asmody
 
25.05.15
12:50
(19) В чем проблема со Знач?
А Вычислить() — ну нельзя в 1С саму функцию передать, приходится выворачиваться. А это хоть и кривой, но самый быстрый и понятный способ реализации.
22 D_E_S_131
 
25.05.15
13:44
(17) Еще один эстет?
23 fisher
 
25.05.15
14:32
(21) Стрёмно коллекции по Знач передавать. Ну а Вычислить() - это такая вундервафля, которую лучше без крайней необходимости не использовать.
(22) Да. В человеке всё должно быть прекрасно - погоны, кокарда, исподнее.