merge(int * string)list ocaml

时间:2013-11-24 18:15:32

标签: list function count char 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")]

有人可以帮忙吗?!谢谢!

2 个答案:

答案 0 :(得分:1)

您正在计算重复的相邻值,即所谓的游程编码。您似乎想要计算整个输入的出现次数。您可以预先对输入进行排序,也可以使用更复杂的数据结构(例如地图)来跟踪您的计数。

答案 1 :(得分: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)]