![]() |
![]() |
![]() |
|
Обход массива массивов | ☑ | ||
---|---|---|---|---|
0
breezee
04.12.15
✎
18:50
|
У меня есть массив. В ккаждом лементе массива слева и справа содержаться цифры мне нужно добавить в массив те элементы, у которых левые или правые цифры совпадают. Сделал алгоритм http://rghost.ru/86JyYBnyr
Может некорректно работать алгоритм? Т.е. не потому что я его неправильно запрограммировал, а потому что неправильно составил. |
|||
1
breezee
04.12.15
✎
18:52
|
Блин. тему не подправил. Она так плохо называется, потому что сначала хотел скинуть все что написал, потом решил что ошибка может быть в алгоритме, а написал я слишком много(особенно для вечеря пятницы)
|
|||
2
breezee
04.12.15
✎
19:03
|
Хотя, наверное, распишу. Уже создавал тему с пролблемой. Думал что решил - оказалось что нет.
У меня есть строка вида "КО_1,2;11,22+КО_3,3;11,22+КО_1,2;4,4+КО_5,5;55,55" Эту строку я разбиваю в массив в котором содержаться стрктура. В этой струткуре содержится счет МассивКООб[Тут мои счета]. Т.е. МассивКООб[0]=КО_1,2;11,22 У этого элемента массива Счета содержаться в значение структуры "СЧЕТ" Т.е. МассивКООб[0].СЧЕТ = 1,2;11,22 А в этом счете содержаться еще 2 массива. В одном счета слева МассивКООб[0].СЧЕТ[0] = 1,2 и счета справа МассивКООб[0].СЧЕТ[1] = 11,22 И в этотом массиве еще 1 массив. Т.е. чтобы получить "1" из счета "КО_1,2;11,22" Мне нужно обратиться К МассивКООб[0].СЧЕТ[0][0]=1. Из этой строки мне нужно найти все элементы самого верхнего массива МассивКООб[0] В котором одинаковы все элементы МассивКООб[к].СЧЕТ[0] или МассивКООб[кк].СЧЕТ[1].(к и ж - от 0 до конца количтва элементов главного массива МассивКООб[]) Т.е. в результате мне должно сказать что по кредиту у меня одинаковые счета Одинаковые по кредиту КО_1,2;11,22+КО_1,2;4,4 Одинаковые по дебету КО_1,2;11,22+КО_3,3;11,22 Когда нахожу одинаковый счет - ставлю пометку "ПРОЙДЕН" и добавляю в массив. В отладке смотрю - странным образом добавляется только последний счет. Вот код, может подскажете - где я мог ошибиться Для к = 0 По ОбщееКоличествоКОСчетов цикл //Обход всех КО Если НЕ МассивКООб[к].БЫЛПРОЙДЕН тогда МассивСопавшихКт = Новый Массив;//Для каждого счета ищем полность совпавшие и добавляем в массив МассивСопавшихДт = Новый Массив; СтруктураСовпавших = Новый Структура("ДТ,КТ"); ОписаниеВнешний = МассивКООб[к].ОПИСАНИЕ; //КО с Которым сравниваю МассивКООб[к].БЫЛПРОЙДЕН = истина; МассивСопавшихКт.Добавить(МассивКООб[к]);//Добавляю первый счет в любом случае Для кк = 0 По ОбщееКоличествоКОСчетов цикл //Обход всех КО для еще раз для сравнения Если к <> кк и МассивКООб[к].СЧЕТ[0].Количество()= МассивКООб[кк].СЧЕТ[0].Количество() и МассивКООб[к].ЗНАК = МассивКООб[кк].ЗНАК и НЕ МассивКООб[кк].БЫЛПРОЙДЕН Тогда //Если не разное количество счетов или тот же самый счет ПолноеСовпадениеКредит = 0; Для ж = 0 По МассивКООб[к].СЧЕТ[0].Количество()-1 цикл //По счетам кредита верхнего КО ЕстьСовпадениеДляОдногоСчета = Ложь; Для жк = 0 По МассивКООб[кк].СЧЕТ[0].Количество()-1 цикл //По счетам кредита нижнего КО Если МассивКООб[к].СЧЕТ[0][ж] = МассивКООб[кк].СЧЕТ[0][жк] тогда //Если счета не равны ЕстьСовпадениеДляОдногоСчета = Истина; //Если совпало хоть с одни КонецЕсли; КонецЦикла; Если ЕстьСовпадениеДляОдногоСчета Тогда ПолноеСовпадениеКредит = ПолноеСовпадениеКредит + 1; КонецЕсли; КонецЦикла; Если ПолноеСовпадениеКредит = МассивКООб[к].СЧЕТ[0].Количество() Тогда //Если есть полное совпадение //МассивКООб[к].БЫЛПРОЙДЕН = истина; МассивКООб[кк].БЫЛПРОЙДЕН = истина; МассивСопавшихКт.Добавить(МассивКООб[кк]);//Добавляем в массив совпавших совпавший элемент КонецЕсли; ПолноеСовпадениеКредит = 0; КонецЕсли; КонецЦикла; СтруктураСовпавших.КТ = МассивСопавшихКт; ////////////////////////////////////////////////ДЕБЕТ//////////////////////////////////////////////////////////////// Для кк = 0 По ОбщееКоличествоКОСчетов цикл //Обход всех КО для еще раз для сравнения Если к <> кк и МассивКООб[к].СЧЕТ[1].Количество()= МассивКООб[кк].СЧЕТ[1].Количество() и МассивКООб[к].ЗНАК = МассивКООб[кк].ЗНАК и НЕ МассивКООб[кк].БЫЛПРОЙДЕН Тогда //Если не разное количество счетов или тот же самый счет ПолноеСовпадениеКредит = 0; Для ж = 0 По МассивКООб[к].СЧЕТ[1].Количество()-1 цикл //По счетам кредита верхнего КО ЕстьСовпадениеДляОдногоСчета = Ложь; Для жк = 0 По МассивКООб[кк].СЧЕТ[1].Количество()-1 цикл //По счетам кредита нижнего КО Если МассивКООб[к].СЧЕТ[1][ж] = МассивКООб[кк].СЧЕТ[1][жк] тогда //Если счета не равны ЕстьСовпадениеДляОдногоСчета = Истина; //Если совпало хоть с одни КонецЕсли; КонецЦикла; Если ЕстьСовпадениеДляОдногоСчета Тогда ПолноеСовпадениеКредит = ПолноеСовпадениеКредит + 1; КонецЕсли; КонецЦикла; Если ПолноеСовпадениеКредит = МассивКООб[к].СЧЕТ[1].Количество() Тогда //Если есть полное совпадение //МассивКООб[к].БЫЛПРОЙДЕН = истина; МассивКООб[кк].БЫЛПРОЙДЕН = истина; МассивСопавшихДт.Добавить(МассивКООб[кк]);//Добавляем в массив совпавших совпавший элемент КонецЕсли; ПолноеСовпадениеКредит = 0; КонецЕсли; КонецЦикла; СтруктураСовпавших.ДТ = МассивСопавшихДт; КонецЕсли; КонецЦикла; |
|||
3
Мэс33
04.12.15
✎
19:03
|
(1) Ты пьян ))
Давайте завтра посмотрим ))) |
|||
4
breezee
04.12.15
✎
19:05
|
(3) Да не, я просто уставший как собака :D
|
|||
5
фобка
04.12.15
✎
19:05
|
(2) это жесть какая-то... Реально
|
|||
6
Cyberhawk
04.12.15
✎
19:06
|
Пилишь какой-нибудь конструктор проводок в режиме предприятия?
|
|||
7
breezee
04.12.15
✎
19:08
|
(6) Неа. Пишу написание запросов. У меня есть запросы к регистру бухглатерии вида КО_1,2;11,22+КО_3,3;11,22+КО_1,2;4,4+КО_5,5;55,55. И я хочу написать штуку,которая пишет запросы за меня. Вроде получается, вот только сейчас застрял.
|
|||
8
Мэс33
04.12.15
✎
19:09
|
(5) Мне тоже поплохело от строки вида "КО_1,2;11,22+КО_3,3;11,22+КО_1,2;4,4+КО_5,5;55,55"
|
|||
9
фобка
04.12.15
✎
19:09
|
"Т.е. МассивКООб[0]=КО_1,2;11,22 .... МассивКООб[0].СЧЕТ = 1,2;11,22" тут несходилово какое-то
|
|||
10
фобка
04.12.15
✎
19:10
|
А это структура типо
|
|||
11
breezee
04.12.15
✎
19:13
|
(9) Вот так это выглядт. Наглядность правда плоха. Может я что-то лишнее добавил(скорее всего)
http://rghost.ru/8JcvdHSd6 |
|||
12
фобка
04.12.15
✎
19:21
|
(11) надо переосмыслить..
Ты получил свой массив из строки 1) Делаешь тз с колонками: массив, дебет, кредит. 2) цикл по элементам массива, заполняешь колонки дебет/кредит и ссылку на массив второго уровня 3) побежали по тз, ищем совпадающие значения, пихаем значения поля массив из строки в результирующий массив или другую тз |
|||
13
breezee
04.12.15
✎
19:26
|
(12) А потом в другой тз уже легче будет отсеить посторяющиеся. Вообще с тз работать легче. Еще завтра покапаюсь в том что написал(просто обидно, довольно долго это лепил) и если не получится - буду в тз обходить. Спасибо!
|
|||
14
breezee
04.12.15
✎
19:33
|
(12) Хотя подумал еще раз - у меня же почти тоже самое тз вышло
|
|||
15
фобка
04.12.15
✎
19:35
|
(14) ага, только структура сложная, циклов много, условий. Разбираться сложнее. В общем - утро вечера мудренЕЕ
|
|||
16
breezee
04.12.15
✎
19:38
|
(15) Еще раз спасибо. Я не знаю чего я так решил все в массив структур поместить. Кажется был неуверен что для элемента тз, если это массив удобно цикл делать.
|
|||
17
Garykom
гуру
04.12.15
✎
19:39
|
ТС сначала может объяснишь в "есть строка вида
"КО_1,2;11,22+КО_3,3;11,22+КО_1,2;4,4+КО_5,5;55,55"" что что и для чего? чтобы понятно было зачем? |
|||
18
Garykom
гуру
04.12.15
✎
19:39
|
(17)+ просто у меня подозрение что задачка проще решается...
|
|||
19
breezee
04.12.15
✎
19:44
|
(17) Не думаю что проще КО_1,2;11,22 Это кредитовый оборот между счетами 1,2 и счетами 11,12(номера счетов конечно с потолка, для наглядности). В оборотах КО для совпавших счетов дебета или кредита, если они имеют одинаковый знак можно выбирать все счета в одном запросе, а не делать несколько. Вот мне и нужно получить все КО у которых по дебету или кредиту одинаковые счета. Блин. Пиши и понимаю что плохо объясняю. Действительно утро вечера мудренее.
|
|||
20
фобка
04.12.15
✎
19:45
|
(16) у тз есть возможность поиска по колонке - у массива нет (у тебя несколько уровней) - только обход в цикле..
(17) Можно взять сразу распарсить из строки в тз Ид кол1 кол2 кол3 кол4 1 1 2 11 22 2 3 3 11 22 ... |
|||
21
breezee
04.12.15
✎
19:46
|
(20) Да, так точно будет проще. Еще раз спасибо большое!! Завтра переделаю
|
|||
22
фобка
04.12.15
✎
19:47
|
(21) незачто)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |