Stories

Detail Return Return

Scala練習 - Stories Detail

wordCount

package com.doit.day03

import scala.io.{BufferedSource, Source}

object WordCountDemo {
  def main(args: Array[String]): Unit = {
    //讀取文件,獲取到一個Source對象
    val source: BufferedSource = Source.fromFile("D:\\develop\\ideaWorkSpace\\myself\\study\\scalaDemo\\data\\word.txt")
    //調用getLines方法,獲取到每一行數據,每一行數據都放在迭代器中
    val lines: Iterator[String] = source.getLines()
    //如果我現在直接這麼返回,他的返回值是什麼??   Iterator[String]  ==》 同樣的返回一個迭代器,迭代器裏面放得是Array[String] 數組裏面每一個元素放得都是一個個的單詞
    val arrWord: Iterator[Array[String]] = lines.map(line => {
      //1.需要將每一行數據拿出來進行切割,變成一個個的單詞
      //hello   hadoop  hive
      val wordsArr: Array[String] = line.split("\\s+")
      wordsArr
    })
    //將迭代器轉換成了集合
    val list: List[Array[String]] = arrWord.toList
    //將list中的array壓平,這樣list裝的就是每一個單詞了
    val word: List[String] = list.flatten
    //對每一個單詞進行分組,相同的單詞分在一組,key就是單詞,value是一個list,所有相同的單詞都放在這個list中
    val wordAndList: Map[String, List[String]] = word.groupBy(word => word)
    //轉換,將list轉換成長度,長度就是單詞的個數
    val wordCount: Map[String, Int] = wordAndList.map(tup => (tup._1, tup._2.size))
    //查看結果
    println(wordCount)
  }
}

平均温度案例

package com.doit.day03

/**
 * 需求:求最近幾天每個城市的平均温度
 */
object AvgTem {
  def main(args: Array[String]): Unit = {
    val d1 = Array(("beijing", 28.1), ("shanghai", 28.7), ("guangzhou", 32.0), ("shenzhen", 31.0))
    val d2 = Array(("beijing", 27.3), ("shanghai", 30.1), ("guangzhou", 33.3))
    val d3 = Array(("beijing", 28.2), ("shanghai", 29.1), ("guangzhou", 32.0), ("shenzhen", 32.0))

    //1.將所有的數據都放在一個數組或者集合中
    val allData: Array[(String, Double)] = d1 ++ d2 ++ d3
    //Array(("beijing", 28.1), ("shanghai", 28.7), ("guangzhou", 32.0), ("shenzhen", 33.1),("beijing", 27.3), ("shanghai", 30.1), ("guangzhou", 33.3),("beijing", 28.2), ("shanghai", 29.1), ("guangzhou", 32.0), ("shenzhen", 32.1))

    //按照城市分組
    val grouped: Map[String, Array[(String, Double)]] = allData.groupBy(tp => tp._1)

    //方式一,獲取到所有的温度,sum求和後求平均
    val res: Map[String, Double] = grouped.map(tp => {
      //數組中每一個元素的key都是一樣的,只是温度不一樣,現在需要將整個數組轉換成城市,平均温度
      val value: Array[(String, Double)] = tp._2
      val avg: Double = value.map(_._2).sum / value.length
      (tp._1, avg)
    })
    println(res)


    //方式二,只對value進行處理
    val res1: Map[String, (String, Double)] = grouped.mapValues(tp => {
      val avg: Double = tp.reduce(_._2 + _._2) / tp.length
      (tp(0)._1, avg)
    })

  }
}

共同好友案例

package com.doit.day03

import scala.io.{BufferedSource, Source}

/**
 * 數據如下  :每個字母代表一個人 ,  統計任意一個人和其他人的共同好友
 * A:B,C,D,F,E,O
 * B:A,C,E,K
 * C:F,A,D,I
 * D:A,E,F,L
 * E:B,C,D,M,L
 * F:A,B,C,D,E,O,M
 * G:A,C,D,E,F
 * H:A,C,D,E,O
 * I:A,O
 * J:B,O
 * K:A,C,D
 * L:D,E,F
 * M:E,F,G
 * O:A,H,I,J
 */
object SameFriends {
  def main(args: Array[String]): Unit = {
     val lines: Iterator[String] = Source.fromFile("D:\\develop\\ideaWorkSpace\\myself\\study\\scalaDemo\\data\\friends").getLines()
     val myAndFriends: List[(String, Array[String])] = lines.toList.map(line => {
        //        A:B,C,D,F,E,O   :前面的是我自己,:後面的是我的朋友們
        val arr: Array[String] = line.split(":")
        //獲取到我自己
        val user: String = arr(0)
        //獲取到我的朋友們,朋友們都放在數組裏面,裏面的元素就是一個個的朋友對象
        val friends: Array[String] = arr(1).split(",")
        (user, friends)
     })

     //獲取共同好友。。。
     for(i <- 0 until myAndFriends.length){
        for(j <- i+1 until myAndFriends.length){
           //從第一個元素開始取
           val tuple: (String, Array[String]) = myAndFriends(i)
           val tuple1: (String, Array[String]) = myAndFriends(j)
           //看是不是有共同好友,是不是取交集
           val sameFriends: Array[String] = tuple._2.intersect(tuple1._2)
           println("用户:"+tuple._1+"用户:"+tuple1._1+"的共同好友是:"+sameFriends.mkString(","))
        }
     }
  }
}
user avatar grow-with-the-times Avatar
Favorites 1 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.