这比MarkLogic更像是一个XQuery。我有三个map:map,每个地图都有“ id”和得分的键值对。我想根据每张地图的得分对所有不同的ID进行排序。例如:
map1 : 1:2048, 5:2000
map2 : 2:5000, 1:1000, 4:3000
map3 : 6:100, 7:5000, 2:2000
在上面的示例中,每个映射的键值都是id:score(不知道如何在这里表示:))。
我想要基于分数的三张地图的ID排序列表。
有没有一种好方法或更好的方法来进行排序,还是我必须合并映射的键并迭代键的序列并对它们进行排序?
这似乎是折叠的绝佳用例。它是Xquery 3.0规范的一部分。
折叠可以遍历一系列项目,并在遍历每个项目时获得结果。在此示例中,$ combinedMaps是最后一次调用的结果,而$ mapToMerge是当前正在执行的序列中的项目。
这是您要执行的操作的示例。
declare function local:sortMaps(
$newMap as map:map,
$mapA as map:map,
$mapB as map:map
) as map:map {
let $build :=
for $key in map:keys($mapA)
let $otherMapValue :=
(map:get($mapB, $key), 0)[1]
let $value := map:get($mapA, $key)
return
if ($value gt $otherMapValue) then (
map:put($newMap, $key, $value)
) else (
map:put($newMap, $key, $otherMapValue)
)
return $newMap
};
let $map1 :=
map:new((
map:entry("1",2048),
map:entry("5",2000)
))
let $map2 :=
map:new((
map:entry("2",5000),
map:entry("1",1000),
map:entry("4",3000)
))
let $map3 :=
map:new((
map:entry("6",100),
map:entry("7",5000),
map:entry("2",2000)
))
let $maps := ($map1, $map2, $map3)
return
fn:fold-left(
function($combinedMaps, $mapToMerge) {
let $newMap := map:map()
let $newMap := local:sortMaps($newMap, $combinedMaps, $mapToMerge)
let $newMap := local:sortMaps($newMap, $mapToMerge, $combinedMaps)
return $newMap
},
$maps[1],
$maps
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句