我有一个表示字符数的整数值数组。 我想将字符值打印为字母后跟计数
例如,0数组成员作为字母'a'的计数,依此类推。
答案 0 :(得分:5)
从技术上讲,这个问题未定义。 let f _ = 'a'
将是一个正确的答案。我们需要知道所需的编码。但我认为可以安全地假设你正在谈论以下编码之一,充满了领先的零位:
或者,如果您对.NET字符究竟是什么有一个共同的误解,那么您可能意味着UTF-32。但是不可能将UTF-32 int可以表示的所有字符转换为单个字符。 char
类型实际上被定义为UTF-16代码单元。
无论如何,如果我们忽略使用的空间量,所有这些都将'a'编码为97.
以下是一些工具:
char
将数字输入转换为UTF-16,这是.NET中字符使用的内部编码。答案 1 :(得分:2)
let str = "Hello World!"
// Convert to an int array and group by key.
let count_array =
str.ToCharArray()
|> Array.map int
|> Array.groupBy id // Groups them by ints
// Since the ints are the same in this case, we convert the array length to counts.
// We also convert k back to char.
|> Array.map (fun (k,ar) -> char k, ar.Length)
printfn "%A" count_array
// [|('H', 1); ('e', 1); ('l', 3); ('o', 2); (' ', 1); ('W', 1); ('r', 1); ('d', 1);
// ('!', 1)|]
Vandroiy的答案有一些相关的信息,但这是一个简单的方法来做你所要求的。
上面的代码是低效的,因为我从字符串转换为char数组到int数组并返回char。虽然在从char到int的单个级别转换是无操作,但每个函数调用都会遍历数组并创建一个新的函数调用,将其留给GC来处理旧的。这会造成内存流失。