2013-11-24 167 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)]