20.04.2006, 14:31 | #1 |
Участник
|
map+map
Каким образом можно сложить значения 2-ух карт...если известно что их ключи идентичны....?
|
|
20.04.2006, 14:35 | #2 |
Участник
|
сложить - это как? При совпадении ключа value + value? а value какого типа?
|
|
20.04.2006, 14:43 | #3 |
Участник
|
key - str
value - integer |
|
20.04.2006, 14:45 | #4 |
Участник
|
то есть получить карту с такими же ключами и суммой value?
|
|
20.04.2006, 14:49 | #5 |
Banned
|
А как насчет не Map, а класса KeySum?
|
|
20.04.2006, 14:54 | #6 |
Участник
|
значит...не стоит свечь?
|
|
20.04.2006, 14:58 | #7 |
NavAx
|
Вот так должно работать:
PHP код:
|
|
|
За это сообщение автора поблагодарили: Aslan (1). |
20.04.2006, 14:58 | #8 |
Участник
|
Боюсь, что кроме перебора mapa никак.
|
|
20.04.2006, 15:19 | #9 |
Участник
|
спасибо всем хоть так можно
|
|
23.10.2013, 16:53 | #10 |
Участник
|
Заранее прошу прощения за поднятие темы.
Нужен почти тот же результат, только вместо сложений значений map-ов, нужно добавить элементы вторго мепа к элементам первого. То есть, например: Есть map1 из 7 элементов; Есть map2 из 5 элементов; Хочу получить map3, который будет состоять из 12 элементов. Это возможно ? Заранее спасибо за ответы!! |
|
23.10.2013, 17:46 | #11 |
Участник
|
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
23.10.2013, 17:57 | #12 |
Участник
|
А ключи не могут пересекаться ибо в ключе есть tableId, он может измениться только при изменении базы данных ведь. Над этой ситуацией не думал... Весь день сижу уже мудрю..
Можно ещё запаковать оба мепа в контейнер и тогда надо подумать, как сложить 2 контейнера. Ссылку посмотрю сейчас, спасибо! |
|
23.10.2013, 18:28 | #13 |
Роман Долгополов (RDOL)
|
Нечего тут голову ломать
1. Если ключи не пересекаются - так и сохраняйте сразу в одном. Например, передавайте ссылку на мап через параметр в метод, добавляющий в них элементы вместо складывания результирующих мапов. Вот час назад писал как раз такое X++: private Map calcJournalLines(mInventRejectJournalTable _journalTable, InventTable _inventTable, mProgressBarNoTotals _bar) { Map journalLines = new Map(Types::String, Types::Container); ; this.calcInventTrans(_journalTable, _inventTable, _bar, journalLines); this.calcInventSettlements(_journalTable, _inventTable, _bar, journalLines); return journalLines; } 2. Очевидный и правильный путь - обойти один мап и вставить во второй 3. Трюк с перепаковкой и сложение контейнеров то-же возможен, но это именно трюк. Сложного, как мне помнится, там ничего нет - кроме самих данных там будет еще заголовок из, боюсь соврать, трех элементов. На форуме была тема со структурой упакованных мапов, сетов и т.д. 4. А может вам и не мап нужен? У всех способов очевидные достоинства и недостатки, но если вы по любым причинам склоняетесь к п.3, то скорее всего с алгоритмом что то не то и стоит об этом серьезно подумать Последний раз редактировалось db; 23.10.2013 в 18:39. Причина: Добавил пример |
|
23.10.2013, 18:39 | #14 |
Участник
|
У map-ов есть есть keyset() и valueset(), а они умеют так:
- set intersection (set1, set2) - возвращает пересечение двух указанных множеств, то есть множество, содержащее элементы, найденные в обоих множествах. - set union (set1, set2) - возвращает объединение двух указанных множеств, то есть множество содержит значения из обоих множеств. - set difference (set1, set2) - возвращает множество, содержащее значения множества set1, не найденные в множестве set2. © Шашков Р., Еременко А. |
|
23.10.2013, 18:41 | #15 |
Роман Долгополов (RDOL)
|
|
|
24.10.2013, 09:27 | #16 |
Участник
|
Может и не нужен. Сейчас подумаю, как алгоритм поменять. Использовал мапы так как нужен уникальный идентификатор, вернее связка 2-х полей для идентификации данных в результирующем наборе данных. А если есть такой же ключ - производить сумму количеств из полей...другого, более изящного решения не придумал.
Последний раз редактировалось user_ax; 24.10.2013 в 09:47. |
|
24.10.2013, 10:26 | #17 |
Участник
|
Два мапа нужно вам из-за того, что вы их в разных местах инициализируете, или для какого-то логического разделения элементов.
Ведь если вопрос только в инициализации, то можно выкрутиться и создать один мап. Передавайте общий мап как параметр в ваши методы и возвращайте его, как результат. Тогда сможете добавить нужные элементы в один мап в нескольких местах еще и от дубликатов избавитесь. Ну а если честно, сколько элементов в сумме в двух мапах получается? Может стоит уже их просто перебрать
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
24.10.2013, 10:32 | #18 |
Участник
|
Цитата:
Сообщение от plumbum
Два мапа нужно вам из-за того, что вы их в разных местах инициализируете, или для какого-то логического разделения элементов.
Ведь если вопрос только в инициализации, то можно выкрутиться и создать один мап. Передавайте общий мап как параметр в ваши методы и возвращайте его, как результат. Тогда сможете добавить нужные элементы в один мап в нескольких местах еще и от дубликатов избавитесь. Ну а если честно, сколько элементов в сумме в двух мапах получается? Может стоит уже их просто перебрать А по поводу метода с мапом в кач-ве параметра не совсем понял, если честно. Данным методом я создаю своих 2 мапа X++: void FindSpecForClose() { //view variable -> JourListTrans jour,list; InvoiceInvent invoice,invent; //<- str listKey, invoiceKey; container listCon, invoiceCon; ; ListMap = new Map(Types::String, Types::Container); InvoiceMap = new Map(Types::String, Types::Container); //->add range in query by date if(bydate) queryRun.query().dataSourceNo(1).addRange(fieldnum(JourListTrans,SpDate)).value(strFmt('(SpDate <= %1)', date2strXpp(bydate))); //<- //info(queryRun.query().dataSourceNo(1).toString()); while(queryRun.next()) { jour = queryRun.get(tablenum(JourListTrans)); list = queryRun.get(tablenum(JourListTrans)); invoice = queryRun.get(tablenum(InvoiceInvent)); invent = queryRun.get(tablenum(InvoiceInvent)); listKey = list.InternalSp + "#" + list.ItemId+"#"+tablenum(VendSpListTrans); invoiceKey = invoice.InternalSp + "#" + invoice.ItemId+"#"+tablenum(VendInvoiceTrans); //check in vendSpListTrans if(ListMap.exists(listKey)) { listCon = ListMap.lookup(listKey); listCon = conpoke(listCon,7,conpeek(listCon,7)+list.SumOfSpQty); listMap.insert(listKey,listCon); } else { listMap.insert(listKey,[jour.IDSp, jour.SpDate, jour.RContractAccount,list.InternalSp, list.ItemId, list.SpUnit, list.SumOfSpQty]); } //check in VendInvoiceTrans if(InvoiceMap.exists(invoiceKey)) { invoiceCon = invoiceMap.lookup(invoiceKey); invoiceCon = conpoke(invoiceCon,3,conpeek(invoiceCon,3)+invoice.SumOfQty); InvoiceMap.insert(invoiceKey,invoiceCon); } else { invoiceMap.insert(invoiceKey,[invoice.ItemId, invoice.PurchUnit, invoice.SumOfQty, invoice.InternalSp, invent.UnitId]); } } } |
|
24.10.2013, 10:39 | #19 |
Участник
|
|
|
24.10.2013, 10:41 | #20 |
Участник
|
Цитата:
Объединение ещё как такового нет, но перед объединением, да, обрабатываю, а именно: провожу сверку единиц измерения и проверяю равенство сумм. |
|