练习 4.8: 修改charcount程序,使用unicode.IsLetter等相关的函数,统计字母、数字等Unicode中不同的字符类别。
练习 4.9: 编写一个程序wordfreq程序,报告输入文本中每个单词出现的频率。在第一次调用Scan前先调用input.Split(bufio.ScanWords)函数,这样可以按单词而不是按行输入。
代码语言:javascript复制// Charcount computes counts of Unicode characters.
package main
import (
"bufio"
"fmt"
"io"
"os"
"unicode"
"unicode/utf8"
)
func main() {
//counts := make(map[string]map[rune]int) // counts of Unicode characters
var utflen [utf8.UTFMax 1]int // count of lengths of UTF-8 encodings
invalid := 0 // count of invalid UTF-8 characters
letters := make(map[rune]int)
numbers := make(map[rune]int)
in := bufio.NewReader(os.Stdin)
for {
r, n, err := in.ReadRune() // returns rune, nbytes, error
if err == io.EOF {
break
}
if err != nil {
fmt.Fprintf(os.Stderr, "charcount: %vn", err)
os.Exit(1)
}
if r == unicode.ReplacementChar && n == 1 {
invalid
continue
}
/*
练习 4.8: 修改charcount程序,使用unicode.IsLetter等相关的函数,统计字母、数字等Unicode中不同的字符类别。
*/
//判断是字母
if unicode.IsLetter(r){
letters[r]
}
//判断是数字
if unicode.IsNumber(r){
numbers[r]
}
//counts[r]
utflen[n]
}
fmt.Printf("runetcountn")
for c, n := range letters {
fmt.Printf("%qt%dn", c, n)
}
fmt.Printf("rune(number)tcountn")
for c, n := range numbers {
fmt.Printf("%qt%dn", c, n)
}
fmt.Print("nlentcountn")
for i, n := range utflen {
if i > 0 {
fmt.Printf("%dt%dn", i, n)
}
}
if invalid > 0 {
fmt.Printf("n%d invalid UTF-8 charactersn", invalid)
}
}
代码语言:javascript复制package main
import (
"bufio"
"fmt"
//"io"
"os"
//"unicode"
//"unicode/utf8"
)
func main() {
counts := make(map[string]int)
input := bufio.NewScanner(os.Stdin)
input.Split(bufio.ScanWords)
for input.Scan(){
counts[input.Text()]
}
for k,v :=range counts{
fmt.Printf("%s == %d n",k,v)
}
}
/*
练习 4.9: 编写一个程序wordfreq程序,报告输入文本中每个单词出现的频率。在第一次调用Scan前先调用input.Split(bufio.ScanWords)函数,这样可以按单词而不是按行输入。
*/