在marklogic 8中对多个地图进行排序
Sorting multiple maps in marklogic 8
与 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
在上面的例子中,每个map都是id:score键值(不知道这里怎么表示:))..
我想要根据分数从三个地图中排序的 id 列表..
有没有好的或更好的排序方法,或者我是否必须联合映射的键并迭代键的序列并对它们进行排序?
这似乎是一个很好的折叠用例。它是 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
)
与 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
在上面的例子中,每个map都是id:score键值(不知道这里怎么表示:))..
我想要根据分数从三个地图中排序的 id 列表..
有没有好的或更好的排序方法,或者我是否必须联合映射的键并迭代键的序列并对它们进行排序?
这似乎是一个很好的折叠用例。它是 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
)