用java实现单词计数_使用Scala实现Java项目的单词计数

本文介绍如何使用Scala编程语言实现Java项目的单词计数功能。Scala具备Python的简洁写法和Java平台的优势,本文通过具体示例展示了Scala的特性,如与Java互操作性、免分号语法、类型推断等,并提供了完整的代码实现。

其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言。 Scala 就是一个不错的选择。本文使用 Scala 实现 Java 项目的单词计数。

Scala 一些特点:

1.  可以容易地与 Java 互操作;

2.  不必写分号;

3.  属性在前,类型在后; “先思考模型,后确定类型” 的思想;

4.  无参函数调用只用写函数名,不必写()

5.  常用结合: Array, ArrayBuffer, mutable.List, immutable.List, mutable.Map, mutable.HashMap, immutable.HashMap, Tuple

访问 Array 或 Map , 使用 array(0) = "xxx" 或 map("key") = "value" ; 访问 Tuple 使用 ._1, ._2, ... 第一个索引为一

6.  使用 map, filter 方法进行映射或过滤处理; 组合起来很强大!

7.  使用 iter.foreach { e => func(e) } 进行遍历处理;

8.  使用 object YourAPP extends App { //code } 实现 Main 函数 。

9.  多看文档。

packagescalastudy.basicimportscala.collection.immutable.Listimportscala.collection.mutableimportscala.collection.mutable.{ArrayBuffer, Map, HashMap}importjava.io.File/*** Created by lovesqcc on 16-3-19.*/object WordStatextendsApp {

val seps= " -!\"#$%&()*,./:;[email protected][]^_`{|}~+<=>\\".toArray

launch()

def launch(): Unit={

val path= "/home/lovesqcc/work/java/ALLIN/src/main/java/"val files=fetchAllJavaFiles(path)//files.foreach { println }

val allWords=files.map(readFile(_)).map(analysisWords(_)).flatten.toList

sortByValue(statWords(allWords)).map(println)

}

def fileJavaFile(filename:String, suffix:String): Boolean={returnfilename.endsWith(suffix)

}

def fetchAllJavaFiles(path:String): Array[String]={

val javaFilesBuf=ArrayBuffer[String]()

fetchJavaFiles(path, javaFilesBuf)returnjavaFilesBuf.toArray

}

def fetchJavaFiles(path:String, javafiles:ArrayBuffer[String]):Unit={

val dirAndfiles= newFile(path).listFilesif (dirAndfiles.length > 0) {

val files=dirAndfiles.filter(_.isFile)if (files.length > 0) {

javafiles++= files.map(_.getCanonicalPath).filter(fileJavaFile(_,".java"))

}

val dirs=dirAndfiles.filter(_.isDirectory)if (dirs.length > 0) {

dirs.map(_.getCanonicalPath).foreach { dirpath=>fetchJavaFiles(dirpath, javafiles) }

}

}

}

def readFile(filename:String): String={importscala.io.Source

val fileSource=Source.fromFile(filename)try{returnfileSource.mkString

}finally{

fileSource.close()

}

}

def analysisWords(content:String):List[String]={returnsplitText(content, WordStat.seps);

}

def statWords(words: List[String]):Map[String,Int]={

val wordsMap= newHashMap[String,Int]

words.foreach { w=>wordsMap(w)= wordsMap.getOrElse(w,0) + 1}returnwordsMap

}

def splitText(text:String, seps:Array[Char]): List[String]={

var init=Array(text)

seps.foreach { sep=>init= init.map(_.split(sep)).flatten.map(_.trim).filter(s => s.length > 0)

}returninit.toList

}

def sortByValue(m: Map[String,Int]): Map[String,Int]={

val sortedm= newmutable.LinkedHashMap[String,Int]

m.toList.sortWith{case(kv1,kv2) => kv1._2 > kv2._2}.foreach { t =>sortedm(t._1)=t._2

}returnsortedm

}

}

原文:http://www.cnblogs.com/lovesqcc/p/5297268.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值