使用XQuery获取序列中最重复的元素

时间:2010-06-24 15:43:17

标签: xquery sequence

我有一系列的价值观。他们都可以平等......或不。因此,使用XQuery,我想获得序列中最频繁的项目。

let $counter := 0, $index1 := 0 
for $value in $sequence 
if (count(index-of($value, $sequence))) 
then 
{ 
$counter := count(index-of($value, $sequence)) $index1 := index-of($value) 
} else {} 

我无法做到这一点,所以我想我做错了什么。

提前感谢你能给我的任何帮助。

2 个答案:

答案 0 :(得分:6)

使用

  for $maxFreq in 
           max(for $val in distinct-values($sequence)
                     return count(index-of($sequence, $val))
               )
   return
      distinct-values($sequence)[count(index-of($sequence, .)) eq $maxFreq]

更新,2015年12月

这显然更短,但可能效率不高:

$pSeq[index-of($pSeq,.)[max(for $item in $pSeq return count(index-of($pSeq,$item)))]]

可以为XPath 3.1构建最短的表达式:

enter image description here

甚至更短且可复制 - 使用单字符名称:

$s[index-of($s,.)[max($s ! count(index-of($s, .)))]]

答案 1 :(得分:1)

你正在从太多的必要立场来解决这个问题。

在XQuery中,您可以设置变量的值,但永远不能更改它们。

执行迭代类型算法的正确方法是使用递归函数:

declare funciton local:most($sequence, $index, $value, $count)
{
  let $current=$sequence[$index]
  return
    if (empty($current))
    then $value
    else
      let $current-count = count(index-of($current, $sequence))
      return
        if ($current-count > $count)
        then local:most($sequence, $index+1, $current, $current-count)
        else local:most($sequence, $index+1, $value, $count)
}

但是解决问题的更好方法是以非迭代的方式描述问题。在这种情况下,序列中的所有不同值都需要显示任何不同值的最大次数。

以前的翻译成XQuery的传票是

let $max-count := max(for $value1 in distinct-values($sequence)
                      return count(index-of($sequence, $value1)))
for $value2 in distinct-values($sequence)
where (count(index-of($sequence, $value2)) = $max-count
return $value2