Получите самый повторный элемент в последовательности с XQuery

У меня есть последовательность значений. Они могут все быть равными... или нет. Таким образом с 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 {} 

Я не могу сделать эту работу, таким образом, я предполагаю, что делаю что-то не так.

Заранее спасибо за любую справку Вы могли дать мне.

6
задан Flynn1179 26 December 2015 в 23:22
поделиться

2 ответа

Используйте :

  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 г. :

Это заметно короче, но может быть не слишком эффективным:

$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, .)))]]
6
ответ дан 17 December 2019 в 00:03
поделиться

Вы подходите к этой проблеме с чрезмерно императивной точки зрения.

В 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
1
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: