use std::env;
use std::io::prelude::*;
use std::fs::File;
use std::io::BufReader;
use std::collections::HashMap;
fn main() {
let args: Vec<_> = env::args().collect();
let filename = if args.len() > 1 { args[1].as_str() } else { "page1.txt" };
let mut cf = HashMap::new();
if let Ok(f) = File::open(filename) {
for line in BufReader::new(f).lines() {
for c in line.unwrap().chars() {
*cf.entry(c).or_insert(0) += 1;
}
}
let mut cfv: Vec<(&char, &u32)> = cf.iter().collect();
cfv.sort_by(|a,b| b.1.cmp(a.1));
for v in cfv.iter() {
println!("{}: {}", v.0, v.1);
}
} else {
println!("Cannot open file");
}
}
|
package main
import (
"fmt"
"os"
"bufio"
"sort"
)
func main() {
filename := "page1.txt"
if len(os.Args) > 1 {
filename = os.Args[1]
}
f, err := os.Open(filename)
if err != nil {
fmt.Println("Cannot open file")
return
}
defer f.Close()
cf := map[rune]int{}
reader := bufio.NewReader(f)
for {
if line, err := reader.ReadString('\n'); err != nil {
break
} else {
for _, c := range []rune(line) {
if n, ok := cf[c]; ok {
cf[c] = n + 1
} else {
cf[c] = 1
}
}
}
}
// sort map in python: sorted(m, key=lambda k:m[k])
cfv := sortMapByVal(cf)
for _, v := range cfv {
fmt.Printf("%c: %d\n", v.Key, v.Value)
}
}
// Borrow from Andrew Gerrand's solution
type Pair struct {
Key rune
Value int
}
type PairList []Pair
func (p PairList) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
func (p PairList) Len() int {
return len(p)
}
func (p PairList) Less(i, j int) bool {
return p[j].Value < p[i].Value
}
func sortMapByVal(cm map[rune]int) PairList {
p := make(PairList, len(cm))
i := 0
for k, v := range cm {
p[i] = Pair{k, v}
i += 1
}
sort.Sort(p)
return p
}
|
import scala.io.Source
import scala.collection.mutable.Map
object CharFreq extends App {
val filename = if (args.length > 0) args(0) else "page1.txt";
val cf = Map[Char,Int]()
try {
for (line <- Source.fromFile(filename).getLines()) {
line.toList foreach { (x) => cf += x -> (cf.getOrElse(x, 0) + 1) }
}
val cfv = cf.toSeq.sortBy(-_._2)
cfv foreach { (cp) => println(s"${cp._1}: ${cp._2}") }
} catch {
case ex: Exception => println("Cannot open file")
}
}
|
import os, tables, unicode
let filename = if paramCount() > 0: paramStr(1) else: "page1.txt"
var cf = initCountTable[string]()
try:
for line in lines filename:
for c in runes(line):
cf.inc(c.toUTF8())
except IOError:
echo "IOError:" & getCurrentExceptionMsg()
cf.sort()
for k, v in cf.pairs():
echo $k,": ",$v
|
import os
def main(filename, encoding = 'utf-8'):
if not os.path.exists(filename):
print 'Cannot open file'
return
cf = {}
with open(filename) as fp:
for line in fp:
for c in line.decode(encoding):
cf[c] = cf.get(c, 0) + 1
cfv = sorted([(k,v) for k,v in cf.items()], key=lambda x:x[1], reverse=True)
for c, v in cfv:
print '%s: %d' % (c, v)
if __name__ == '__main__':
import sys
filename = sys.argv[1] if len(sys.argv) > 1 else 'page1.txt'
main(filename)
|
// Node v5.0+
const fs = require('fs'),
readline = require('readline');
const main = (filename, done) => {
var cf = {};
readline.createInterface({
input: fs.createReadStream(filename),
terminal: false
}).on('line', (line)=>{
for (var i in line) {
var c = line[i];
cf[c] = (cf[c] || 0) + 1;
}
}).on('close', ()=>{
var cfv = [];
for (var k in cf) {
cfv.push([k, cf[k]]);
}
cfv.sort((a,b)=>{
return b[1] - a[1];
});
done(cfv);
});
}
main(process.argv[2] || 'page1.txt', (sorted)=>{
for(var i in sorted) {
console.log(sorted[i][0]+': '+sorted[i][1]);
}
process.exit(0);
});
|
filename = length(ARGS) > 0 ? ARGS[1] : "page1.txt"
cf = Dict()
f = open(filename)
for line in eachline(f)
for c in line
cf[c] = get(cf, c, 0) + 1
end
end
close(f)
cf = sort(collect(cf), by=x->x[2], rev=true)
for (k, v) in cf
println("$k: $v")
end
|
time target/release/charfreq large.txt
real 0m0.035s
user 0m0.018s
sys 0m0.011s
|
time charfreq large.txt
real 0m0.055s
user 0m0.031s
sys 0m0.016s
|
time java -cp .:scala-libary.jar CharFreq
real 0m0.381s
user 0m0.401s
sys 0m0.039s
time scala CharFreq
real 0m0.440s
user 0m0.433s
sys 0m0.039s
|
time ./charfreq large.txt
real 0m0.384s
user 0m0.352s
sys 0m0.023s
(nim c -d:release charfreq.nim)
|
time python py_charfreq.py
real 0m1.178s
user 0m1.140s
sys 0m0.032s
|
time node charfreq.js
real 0m2.088s
user 0m2.064s
sys 0m0.024s
|
time julia charfreq.jl
real 0m3.193s
user 0m3.173s
sys 0m0.659s
|