2013-11-24 137 views
0

我有這樣的功能:合併爲(int *字符串)列表ocaml的

let encode list = 
let rec aux count acc = function 
| [] -> [] (* Caso a lista esteja vazia*) 
| [x] -> (count+1, x) :: acc 
| a :: (b :: _ as t) -> 
    if a = b then aux (count + 1) acc t 
      else aux 0 ((count+1,a) :: acc) t in 
     List.rev (aux 0 [] list) 
;; 

,並與該輸入:

let test = encode ["a";"a";"a";"a";"b";"f";"f";"c";"c";"a";"a";"d";"e";"e";"e";"e"];; 

,我有這樣的輸出:

val test : (int * string) list = 
[(4, "a"); (1, "b"); (2, "f"); (2, "c"); (2, "a"); (1, "d"); (4, "e")] 

但「a」是重複的,「f」需要在最後! 我需要像輸出:

val test : (int * string) list = 
[(6, "a"); (1, "b"); (2, "c"); (1, "d"); (4, "e"); (2, "f")] 

任何人的幫助,請?謝謝!

回答

1

您正在計算重複的相鄰值,即所謂的遊程編碼。看起來你想要統計整個輸入的出現次數。您可以事先對輸入進行排序,也可以使用更復雜的數據結構(例如Map)來跟蹤您的計數。

0

事情是這樣的:

let encode xs = 
    let f acc x = 
    let n = try M.find x acc with Not_found -> 0 in 
    M.add x (n+1) acc in 
    let ans = (List.fold_left f M.empty) xs in 
    M.bindings ans ;; 

# encode ["a";"a";"a";"a";"b";"f";"f";"c";"c";"a";"a";"d";"e";"e";"e";"e"];; 
- : (M.key * int) list = 
[("a", 6); ("b", 1); ("c", 2); ("d", 1); ("e", 4); ("f", 2)]