首页 > 编程语言 > 详细

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

时间:2016-03-20 11:39:44      阅读:236      评论:0      收藏:0      [点我收藏+]

 

    其实我想找一门“具有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.  多看文档。 

 

package scalastudy.basic

import scala.collection.immutable.List
import scala.collection.mutable
import scala.collection.mutable.{ArrayBuffer, Map, HashMap}
import java.io.File

/**
 * Created by lovesqcc on 16-3-19.
 */
object WordStat extends App {

  val seps = " -!\"#$%&()*,./:;?@[]^_`{|}~+<=>\\".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 = {
    return filename.endsWith(suffix)
  }

  def fetchAllJavaFiles(path:String): Array[String] = {
    val javaFilesBuf = ArrayBuffer[String]()
    fetchJavaFiles(path, javaFilesBuf)
    return javaFilesBuf.toArray
  }

  def fetchJavaFiles(path:String, javafiles:ArrayBuffer[String]):Unit = {
    val dirAndfiles = new File(path).listFiles
    if (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 = {
    import scala.io.Source
    val fileSource =  Source.fromFile(filename)
    try {
      return fileSource.mkString
    } finally {
      fileSource.close()
    }
  }

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

  def statWords(words: List[String]):Map[String,Int] = {
    val wordsMap = new HashMap[String,Int]
    words.foreach { w =>
      wordsMap(w) = wordsMap.getOrElse(w,0) + 1
    }
    return wordsMap
  }

  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)
    }
    return init.toList
  }

  def sortByValue(m: Map[String,Int]): Map[String,Int] = {
    val sortedm = new mutable.LinkedHashMap[String,Int]
    m.toList.sortWith{case(kv1,kv2) => kv1._2 > kv2._2}.foreach { t =>
      sortedm(t._1) = t._2
    }
    return sortedm
  }

}

 

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!