2010-06-24 5 views
6

J'ai une séquence de valeurs. Ils peuvent tous être égaux ... ou non. Donc, avec XQuery, je veux obtenir l'élément le plus fréquent dans la séquence. Je ne peux pas faire ce travail, donc je suppose que je suis en train de faire quelque chose d'anormal.Récupère l'élément le plus répété dans une séquence avec XQuery

Merci d'avance pour toute aide que vous pourriez me donner.

+0

Bonne question à nouveau (+1). Et la réponse est une expression XPath one-liner ... essayera de le rendre encore plus court. –

Répondre

6

Utilisation:

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] 

Mise à jour, décembre 2015:

Ceci est notablement plus courte, bien que peut-être pas trop -Efficace:

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

L'expression la plus courte peut être construit pour XPath 3.1:

enter image description here

Et encore plus court et copiable - en utilisant un nom d'un personnage:

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

Merci beaucoup, je pense que mon inexpérience m'a conduit à essayer une approche très tordue. – deb

1

Vous abordez ce problème de manière trop impérative.

Dans XQuery, vous pouvez définir les valeurs des variables, mais vous ne pouvez jamais les modifier.

La bonne façon de faire des algorithmes de type itératif est une fonction récursive:

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) 
} 

mais une meilleure façon d'aborder le problème est en décrivant le problème d'une manière non itérative. Dans ce cas de toutes les valeurs distinctes dans votre séquence, vous voulez celui qui apparaît nombre maximum de fois de toute valeur distincte.

Le Sentance précédent traduit en XQuery est

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 
+0

Merci beaucoup, j'ai essayé votre chemin et fonctionne également. – deb

Questions connexes