簡體   English   中英

合並(int *字符串)列表ocaml

[英]merge (int * string) list 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")]

有人可以幫忙嗎? 謝謝!

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

像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM