|
Как сравнить два массива с датами? | ☑ | ||
---|---|---|---|---|
0
drago92
10.08.15
✎
07:30
|
Есть 2 массива с датами, их надо сравнить между собой и вывести те даты которые не повторились.
|
|||
1
1Сергей
10.08.15
✎
07:31
|
самое простое, но не оптимальное: цикл в цикле
|
|||
2
drago92
10.08.15
✎
07:31
|
а если через таблицу значений
|
|||
3
Альбатрос
10.08.15
✎
07:32
|
Запросом
|
|||
4
drago92
10.08.15
✎
07:32
|
то тогда как в ее запихнуть оба массива, один без проблем получается, со вторым беда
|
|||
5
magicSan
10.08.15
✎
07:36
|
Запросом фигли там думать
|
|||
6
1Сергей
10.08.15
✎
07:38
|
(1) + хотя можно одним циклом с поиском в другом массиве
|
|||
7
drago92
10.08.15
✎
08:31
|
Для каждого Элемент ИЗ КолонкаМесяц Цикл
МассивСтрок.Найти(Элемент) Если а как дальше |
|||
8
el7cartel
10.08.15
✎
08:35
|
(7) ну так посмотри что тебе возвращает функция МассивСтрок.Найти(Элемент), запоминай номер и значение!
|
|||
9
DCKiller
10.08.15
✎
08:35
|
1. Создаешь 2 таблицы значений
2. Выгружаешь каждый массив в свою ТЗ. 3. Делаешь запрос к обеим таблицам, помещаешь их в ВТ. 4. Потом в запросе формируешь внутренним соединением таблицу с повторяющимися датами. 5. В запросе формируешь финальную таблицу объединением из двух исходных, установив фильтр НЕ по таблице, создаваемой на предыдущем шаге. 6. PROFIT!!!!1111 |
|||
10
Фокусник
10.08.15
✎
08:43
|
(9) Чем это лучше такого:
1. Создаем одну ТЗ с колонками: Дата, Счетчик 2. Делаем два цикла заполнения этой ТЗ для каждого массива. По первому массиву в "Счетчик" помещаем +1, по второму -1 3. Сворачиваем эту ТЗ.Свернуть("Дата", "Счетчик"). 4. Перебираем ТЗ, при этом можно сразу определить в каком массиве есть дата (+1 или -1, или 0 если в обоих). Уточнение. Если заранее не известно, могут ли повторяться даты в массиве, то нужно предварительно сгруппировать: ТЗ.Свернуть("Дата, Счетчик") а потом уже сворачивать: ТЗ.Свернуть("Дата", "Счетчик") Разве запрос быстрее, проще? ;) |
|||
11
drago92
10.08.15
✎
09:06
|
Для Индекс = 0 по МассивСтрок.ВГраница() Цикл
Ок = 0; Для Индекс1 = 0 по КолонкаМесяц.ВГраница() Цикл Если МассивСтрок[Индекс]=КолонкаМесяц Тогда Ок = 1; КонецЕсли; КонецЦикла; //Сообщить(Ок); Если Ок<>1 тогда Сообщить("Нет Значения"+ МассивСтрок[Индекс]); КонецЕсли; КонецЦикла; я сделал вот так он работает |
|||
12
Альбатрос
10.08.15
✎
09:17
|
(11) чот сомнительна...
|
|||
13
drago92
10.08.15
✎
09:29
|
она работает и выводит месяца каких нет в массиве
Как сделать, что одним циклом? |
|||
14
DCKiller
10.08.15
✎
20:48
|
(10) Того, что ты написал - точно, и быстрее, и проще.
|
|||
15
Armando
10.08.15
✎
21:33
|
||||
16
Фокусник
10.08.15
✎
22:28
|
(14) хм, у меня и пунктов меньше и кода в итоге будет меньше ;)
|
|||
17
Ildarovich
11.08.15
✎
12:19
|
(11) Вариант "цикл в цикле" на больших массивах будет очень долго работать.
Вот вариант, свободный от этого недостатка: ///////////// Функция ИсключающееИЛИ(Массив1, Массив2) Результат = Новый Массив; Повтор = Новый Соответствие; Для каждого Элемент Из Массив1 Цикл Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина) КонецЦикла; Для каждого Элемент Из Массив2 Цикл Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина) КонецЦикла; Для каждого Элемент Из Повтор Цикл Если НЕ Элемент.Значение Тогда Результат.Добавить(Элемент.Ключ) КонецЕсли КонецЦикла; Возврат Результат КонецФункции /////////// Тип данных в массивах может быть любым: не обязательно даты. Повторы в рамках одного массива также будут учтены. Если ограничиться датами, то можно сократить один цикл: ////////// Функция ИсключающееИЛИ(Массив1, Массив2) Результат = Новый Массив; Повтор = Новый Соответствие; Для каждого Элемент Из Массив1 Цикл Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина) КонецЦикла; Для каждого Элемент Из Массив2 Цикл Повтор[Элемент] = ?(Повтор[Элемент] = Неопределено, Ложь, Истина) КонецЦикла; Для каждого Элемент Из Повтор Цикл Если НЕ Элемент.Значение Тогда Результат.Добавить(Элемент.Ключ) КонецЕсли КонецЦикла; Возврат Результат КонецФункции // ////////// |
|||
18
Ildarovich
11.08.15
✎
12:21
|
+(17) Про соответствие, которое является основой решения, можно почитать здесь: http://catalog.mista.ru/public/79285/
|
|||
19
Ildarovich
11.08.15
✎
12:24
|
+(17) Поправка про "если ограничиться датами"(не тот код из буфера вставился). Верный код такой:
////////////////// Функция ИсключающееИЛИ1(Массив1, Массив2) Результат = Новый Массив; Строка1 = ЗначениеВСтрокуВнутр(Массив1); Строка2 = ЗначениеВСтрокуВнутр(Массив2); Для каждого Элемент Из Массив1 Цикл Если НЕ Найти(Строка2, Формат(Элемент,"ДФ=ггггММддЧЧммсс")) Тогда Результат.Добавить(Элемент) КонецЕсли КонецЦикла; Для каждого Элемент Из Массив2 Цикл Если НЕ Найти(Строка1, Формат(Элемент,"ДФ=ггггММддЧЧммсс")) Тогда Результат.Добавить(Элемент) КонецЕсли КонецЦикла; Возврат Результат КонецФункции ////////////////// |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |