这更像是一个XQuery而不是MarkLogic。我有三张地图:地图和每张地图都有“id”和得分的键值对。我想根据每张地图的分数对所有不同的ID进行排序。 例如:
map1 : 1:2048, 5:2000
map2 : 2:5000, 1:1000, 4:3000
map3 : 6:100, 7:5000, 2:2000
在上面的例子中,每个地图都是id:键值得分(不知道如何在这里表示:))..
我希望根据得分从三张地图中排序的id列表。
有没有更好的方法或更好的方法进行排序,还是我必须联合地图的键并迭代键序列并对它们进行排序?
答案 0 :(得分:3)
这似乎是折叠的一个很好的用例。它是Xquery 3.0规范的一部分。
Folding可以浏览一系列项目,并在每个项目完成后获取结果。在这个例子中,$ 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
)