|
Массивы в 1с | ☑ | ||
---|---|---|---|---|
0
SkAt
15.05.18
✎
11:58
|
Доброго времени суток! Есть массив: куча строк и в каждой по несколько значений. Как удалить повторяющиеся элементы?? Тут важный момент: полностью одинаковых строк точно нет (Массив.Найти() не подходит). Нужно проверить 2 значения в строке и если в другой строке такие же - удалить. Заранее спасибо.
|
|||
1
фросия
15.05.18
✎
11:59
|
перебрать. сравнить. повторяющиеся- удалить
|
|||
2
VS-1976
15.05.18
✎
12:00
|
(0) И чем же в строке разделяются значения?
|
|||
3
VS-1976
15.05.18
✎
12:01
|
(1) Значения могут стоять в разных местах. Скорее всего 1,2,3 должно быть = 2,1,3 и равно 3,1,2 и т.д.
|
|||
4
Мандалай
15.05.18
✎
12:05
|
Есть массив, а есть таблица значений.
С чем работаем в данном случае? |
|||
5
1Сергей
15.05.18
✎
12:07
|
Каким образом в каждую строку массива запихивал много элементов?
|
|||
6
MonteCarlo
15.05.18
✎
12:07
|
Если массив строк, а строка это какие то значения разделенные знаком препинания, то можно наверное строки разложить в массив и сравнивать между собой элементы массива уже.
|
|||
7
VS-1976
15.05.18
✎
12:09
|
(6) В сравнении есть шанс на оптимизацию :)
|
|||
8
bolobol
15.05.18
✎
12:09
|
(4) В случае (0) - таблицы значений нет.
Массив.Найти() - скомпилировано. Обход - нет, если объёмы не большие - моно и циклом в цикле циклично. Но правильнее - подготовить данные для Массив.Найти(), хоть на этапе заполнения, хоть перед использованием. |
|||
9
SkAt
15.05.18
✎
12:10
|
Пример
Массив[1]: Т=1, П=1 Массив[2]: Т=2, П=1 Массив[3]: Т=1, П=1 Массив[4]: Т=3, П=3 Массив[5]: Т=2, П=1 ... Удалить строки 5 и 3 |
|||
10
bolobol
15.05.18
✎
12:10
|
Держи:
Массив[1]: Т=1, П=1 Массив[3]: Т=1, П=1 Массив[4]: Т=3, П=3 |
|||
11
VS-1976
15.05.18
✎
12:11
|
(9) Это у тебя контрольная или что?
|
|||
12
bolobol
15.05.18
✎
12:12
|
Тьфу ты... Держи:
Массив[1]: Т=1, П=1 Массив[2]: Т=2, П=1 Массив[4]: Т=3, П=3 |
|||
13
VS-1976
15.05.18
✎
12:12
|
(9) А есть Массив[6]: Т=1, П=2 как должна поступать программа?
|
|||
14
фросия
15.05.18
✎
12:13
|
(9) почему 5 и 3, а не 1 и 2?
|
|||
15
1C programmer
15.05.18
✎
12:14
|
Тут важный момент: полностью одинаковых строк точно нет
Разве 1 <> 3? |
|||
16
bolobol
15.05.18
✎
12:15
|
(13) (14) Коллеги, ТС же не на допросе, чего за странная манера. Задача полностью описана в (0), НП-полная, не знаю, что означает, но решение - имеет
|
|||
17
VS-1976
15.05.18
✎
12:18
|
(16) Обычно пользователи сами не знаю что хотят
|
|||
18
dezss
15.05.18
✎
12:19
|
(12) кэп, мне нужен генератор случайных чисел)
(0) ответ в (8) можно только немного улучшить. Скопируй массив, подготовь данные во 2-м массиве, а удаляй элементы из обоих. |
|||
19
Ненавижу 1С
гуру
15.05.18
✎
12:19
|
может у него массив структур?
|
|||
20
фросия
15.05.18
✎
12:20
|
(16) задача описана, решение имеет, пусть решает, мы тут причем?
|
|||
21
SkAt
15.05.18
✎
12:20
|
Ладно, объяснять я явно не умею. Нарисую массив:
|123|456|789|101| |qwe|456|cxz|101| |dfg|gfd|765|342| |233|200|500|332| |100|gfd|222|342| Сравниваю значения во 2 и 4 столбце. Совпали строки (1и2) и (3и5). Удалить из массива строки 2 и 5 (можно 1 и 3))) |
|||
22
dezss
15.05.18
✎
12:21
|
(21) в (8) ответ.
Подготовь данные, а потом удаляй. Можешь подготовить в таком же массиве, но в котором будут значения только из 2 и 4 столбца |
|||
23
фросия
15.05.18
✎
12:22
|
а если 6-я строка \233\ууу\500\332\
её удалять? |
|||
24
bolobol
15.05.18
✎
12:23
|
(17) Это запрос не от пользователя. Это программеру задачу поставили и он её решение спрашивает. Найдите тут хоть одну тему от пользователя с попыткой постановки задачи
(18) Я займусь этим вопросом - очень нестандартно, свежо! Я думаю, это может иметь успех! (19) Без разницы - ответ всё равно в (8) (20) Вы - не при чём, вопрос был к тем, кто может ответить, ящетаю (с) |
|||
25
фросия
15.05.18
✎
12:23
|
все, перечитала условия вопрос снят
|
|||
26
VS-1976
15.05.18
✎
12:31
|
(21) Известно сколько в строке параметров? И почему значения в столбце 2 и 4. Или всё же различное количество значений в строке?
|
|||
27
SkAt
15.05.18
✎
12:37
|
(26) Значений в строке одинаковое. Массив - результат выгрузки запроса.
Проверяем значения в любых двух указанных столбцах. Только для примера 2 и 4. |
|||
28
dezss
15.05.18
✎
12:41
|
(27) а покажи сам запрос
|
|||
29
bolobol
15.05.18
✎
12:42
|
(27) Тут либо слово -лишнее-, либо +пропущено+ "в любых двух -указанных- +кем-то+ столбцах"
|
|||
30
bolobol
15.05.18
✎
12:43
|
(28) Может, процесс выгрузки его данных в такую странную структуру, заодно?
|
|||
31
SkAt
15.05.18
✎
12:44
|
(28)
ВЫБРАТЬ | ЗадачаИсполнителя.Ссылка КАК Ссылка, | ЗадачаИсполнителя.ДатаНачала КАК НачалоСобытия, | ЗадачаИсполнителя.СрокИсполнения КАК ОкончаниеСобытия, | ЗадачаИсполнителя.Дата КАК Дата, | ЗадачаИсполнителя.Автор КАК Ответственный, | ЗадачаИсполнителя.БизнесПроцесс.Наименование КАК ТемаЗадания, | ЗадачаИсполнителя.Предмет КАК Партнер, | ЗадачаИсполнителя.БизнесПроцесс.РезультатВыполнения КАК Содержание |ИЗ | Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя |ГДЕ | ЗадачаИсполнителя.Выполнена = ЛОЖЬ Если в какой-то строке совпадают одновременно Партнер и ТемаЗадания - брать только одну строку. |
|||
32
dezss
15.05.18
✎
12:44
|
(30) у меня ощущение, что в запросе делается конкатенация)))
|
|||
33
dezss
15.05.18
✎
12:45
|
(31) как тогда у тебя на выходе получается строка????
|
|||
34
bolobol
15.05.18
✎
12:46
|
(33) Вот, сразу с козырей, да?
|
|||
35
bolobol
15.05.18
✎
12:47
|
(31) Подкину:
- Как массив-то получился? |
|||
36
novichok79
15.05.18
✎
12:47
|
В модуле общего назначения в БСП всегда есть много интересного
|
|||
37
novichok79
15.05.18
✎
12:47
|
// Удаляет повторяющиеся элементы массива.
// Функция УдалитьПовторяющиесяЭлементыМассива(Массив, НеИспользоватьНеопределено = Ложь) Экспорт ОписаниеТиповСправочники = Справочники.ТипВсеСсылки(); ОписаниеТиповДокументы = Документы.ТипВсеСсылки(); ОписаниеТиповПВХ = ПланыВидовХарактеристик.ТипВсеСсылки(); ОписаниеТиповПланыСчетов = ПланыСчетов.ТипВсеСсылки(); ОписаниеТиповПланыРасчета = ПланыВидовРасчета.ТипВсеСсылки(); Если ТипЗнч(Массив) = Тип("Массив") Тогда УжеВМассиве = Новый Соответствие; БылоНеопределено = Ложь; КоличествоЭлементовВМассиве = Массив.Количество(); Для ОбратныйИндекс = 1 По КоличествоЭлементовВМассиве Цикл ЭлементМассива = Массив[КоличествоЭлементовВМассиве - ОбратныйИндекс]; ТипЭлемента = ТипЗнч(ЭлементМассива); Если ЭлементМассива = Неопределено Тогда Если БылоНеопределено ИЛИ НеИспользоватьНеопределено Тогда Массив.Удалить(КоличествоЭлементовВМассиве - ОбратныйИндекс); Иначе БылоНеопределено = Истина; КонецЕсли; Продолжить; ИначеЕсли ОписаниеТиповСправочники.СодержитТип(ТипЭлемента) ИЛИ ОписаниеТиповДокументы.СодержитТип(ТипЭлемента) ИЛИ ОписаниеТиповПВХ.СодержитТип(ТипЭлемента) ИЛИ ОписаниеТиповПланыСчетов.СодержитТип(ТипЭлемента) ИЛИ ОписаниеТиповПланыРасчета.СодержитТип(ТипЭлемента) Тогда ИДЭлемента = Строка(ЭлементМассива.УникальныйИдентификатор()); Иначе ИДЭлемента = ЭлементМассива; КонецЕсли; Если УжеВМассиве[ИДЭлемента] = Истина Тогда Массив.Удалить(КоличествоЭлементовВМассиве - ОбратныйИндекс); Иначе УжеВМассиве[ИДЭлемента] = Истина; КонецЕсли; КонецЦикла; КонецЕсли; Возврат Массив; КонецФункции |
|||
38
VS-1976
15.05.18
✎
12:48
|
(34) Убедился что человеку нужно одно, а он решает задачу через задний проход. Ну и как тут вопросы не задавать?
|
|||
39
dezss
15.05.18
✎
12:49
|
(31) делай
Запрос.Выполнить.Выгрузить(), у тебя получится ТЗ и все сразу станет на места... но я бы, все таки просто сделал группировку по этим 2-м полям в самом запросе. И раз тебе не важно, какие строки останутся, то берем максимум по ссылке, пихаем в ВТ, а потом эту ВТ еще раз соединяем с таблицей по ссылке и выбираем все остальные поля. |
|||
40
dezss
15.05.18
✎
12:50
|
(34) крик души....я еще не очерствел до такой степени)))
|
|||
41
bolobol
15.05.18
✎
12:50
|
(38) Задача вполне конкретна. Через проход он её не решал, ибо само решение спрашивает.
Истоки задачи и источниками данных поинтересовались из-за того, что стало интересно и понеслась! |
|||
42
novichok79
15.05.18
✎
12:59
|
а если так?
АхумилительныйМассив = Новый Массив; АхумилительныйМассив.Добавить("1 2 2 2 3 33 33 44 4 4 4"); АхумилительныйМассив.Добавить("456 656 56 3 32 3 3 2 5 55 55 55"); Для ЯУмеюДелатьЦиклы = 0 По АхумилительныйМассив.Количество() - 1 Цикл АхумилительнаяСтрока = АхумилительныйМассив[ЯУмеюДелатьЦиклы]; ВоБЛЯ = СтрРазделить(АхумилительнаяСтрока, " ", Ложь); УникальноеВоБЛЯ = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ВоБЛЯ); АхумилительныйМассив[ЯУмеюДелатьЦиклы] = СтрСоединить(УникальноеВоБЛЯ, " "); КонецЦикла; |
|||
43
bolobol
15.05.18
✎
13:21
|
(42) Это решение какой-то другой задачи... Удаление повторяющихся значений в каждой строке - это начало решения? Тогда - массив исходный попорчен, а так, наверное, нельзя
|
|||
44
novichok79
15.05.18
✎
13:51
|
(43) ладно, а вот так тогда?
АхумилительныйМассив = Новый Массив; АхумилительныйМассив.Добавить("1 2 2 2 3 33 33 44 4 4 4"); АхумилительныйМассив.Добавить("456 656 56 3 32 3 3 2 5 55 55 55"); ВРотМнеНоги = Новый Массив; Для ЯУмеюДелатьЦиклы = 0 По АхумилительныйМассив.Количество() - 1 Цикл АхумилительнаяСтрока = АхумилительныйМассив[ЯУмеюДелатьЦиклы]; ВоБЛЯ = СтрРазделить(АхумилительнаяСтрока, " ", Ложь); УникальноеВоБЛЯ = ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива(ВоБЛЯ); ВРотМнеНоги.Вставить(ЯУмеюДелатьЦиклы, СтрСоединить(УникальноеВоБЛЯ, " ")); КонецЦикла; |
|||
45
novichok79
15.05.18
✎
13:52
|
(43) а не, соррян, это я невнимательно задание прочитал
|
|||
46
Franchiser
гуру
15.05.18
✎
14:38
|
ОбщегоНазначенияБПВызовСервера.УдалитьПовторяющиесяЭлементыМассива(ТвойМассив)
|
|||
47
RKx
15.05.18
✎
14:39
|
Запихать в запрос, и выбрать различные:)
|
|||
48
dezss
15.05.18
✎
15:03
|
(47) ты не поверишь...
он эти данные из запроса и получает)))) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |