2010-06-24 12 views
6

Tôi có một chuỗi các giá trị. Tất cả chúng có thể bằng nhau ... hay không. Vì vậy, với XQuery, tôi muốn có được mục thường xuyên nhất trong chuỗi.Lấy phần tử được lặp lại nhiều nhất trong một chuỗi với 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 {} 

Tôi không thể thực hiện công việc này, vì vậy tôi cho rằng tôi đang làm điều gì đó sai.

Cảm ơn trước vì bất kỳ trợ giúp nào bạn có thể cho tôi.

+0

Câu hỏi hay (+1). Và câu trả lời là biểu thức một lớp của XPath ... sẽ cố gắng làm cho nó ngắn hơn. –

Trả lời

6

Sử dụng:

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] 

Update, tháng 12 năm 2015:

Đây là đặc biệt ngắn hơn, mặc dù có thể không quá -efficient:

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

Khái niệm ngắn nhất có thể được xây dựng cho XPath 3.1:

enter image description here

Và thậm chí ngắn hơn và copyable - sử dụng một tên một nhân vật:

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

Cảm ơn bạn rất nhiều, tôi nghĩ rằng sự thiếu kinh nghiệm của tôi đã khiến tôi thử một cách tiếp cận rất xoắn. – deb

1

Bạn đang tiếp cận vấn đề này từ quá nhiều quan điểm bắt buộc.

Trong XQuery bạn có thể đặt giá trị của biến, nhưng bạn không bao giờ có thể thay đổi chúng.

Cách đúng để làm thuật toán lặp đi lặp lại kiểu là với một hàm đệ quy:

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

nhưng một cách tốt hơn để tiếp cận vấn đề là bằng cách mô tả vấn đề theo một cách không lặp đi lặp lại. Trong trường hợp này của tất cả các giá trị khác nhau trong chuỗi của bạn, bạn muốn giá trị xuất hiện số lần tối đa của bất kỳ giá trị khác biệt nào.

Các sentance trước dịch sang XQuery là

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

Cảm ơn bạn rất nhiều, tôi đã thử cách của bạn và cũng hoạt động. – deb