1. 程式人生 > >《快學Scala》第十三章習題解答

《快學Scala》第十三章習題解答

RT。

package com.scalalearn.scala.main

import scala.collection.mutable
import scala.collection.mutable.ArrayBuffer
import scala.collection.parallel.immutable

/**
  * 快學scala第13章習題解答
  */
object LearnScala13 {
  //1.編寫一個函式,給定字串,產出一個包含所有字元的下標的對映
  //舉例來說,indexs("Missingapi")應返回一個對映,讓'M'對應{0},'i'對應集{1,4,7,10}以此類推
  //使用可變的集合對映
  def execise1(input:String):mutable.HashMap[String,ArrayBuffer[String]] = {
    val map = new scala.collection.mutable.HashMap[String,ArrayBuffer[String]]()
    var index = 0
    for(ch <- input){
      if(!map.contains(ch.toString)) map.put(ch.toString,new ArrayBuffer[String])
      var arr:ArrayBuffer[String] = map.get(ch.toString).get
      arr += index.toString
      index += 1
    }
    map
  }

  //2.與第一題相同,這次用不可變對映集合
  def execise2(input:String):scala.collection.immutable.HashMap[String,ArrayBuffer[String]] = {
    var map = new scala.collection.immutable.HashMap[String,ArrayBuffer[String]]
    var index = 0
    for(ch <- input){
      if(!map.contains(ch.toString)){
        map = map + (ch.toString->new ArrayBuffer[String])
      }
      var arr:ArrayBuffer[String] = map.get(ch.toString).get
      arr += index.toString
      index += 1
    }
    map
  }

  //3.編寫一個函式,從整型連結串列裡去除所有零值
  def execise3(list:mutable.ArrayBuffer[Integer]):mutable.ArrayBuffer[Integer]={
    list.filter(_!=0)
  }

  //4.編寫一個函式,接受一個字串的集合和一個字串到整型的對映,返回整型集合
  def execise4(arr:Array[String],map:Map[String,Integer]):Array[Integer] = {
    val filterArr:Array[String] = arr.filter(map.contains(_))
    val flatRtn = filterArr.flatMap(word=>{
      map.get(word)
    })
    flatRtn
  }

  //5.編寫一個函式,作用於mkString相同,使用reduceLeft函式
  def execise5(joinStr:String,strArr:Array[String]):String = {
    strArr.reduceLeft(_+joinStr+_)
  }

  //8.編寫一個函式,將Double陣列轉為二維陣列
  def execise8(input:Array[Double],colnum:Integer):Array[Array[Double]] = {
    var rtn = new ArrayBuffer[Array[Double]]
    var count = input.length/colnum
    if(input.length % colnum != 0) count += 1
    for(i <- 0 to count){
      if(i != count - 1){
        rtn += input.slice(i*colnum,(i+1)*colnum)
      }else{
        rtn += input.slice(i*colnum,input.length)
      }
    }
    rtn.toArray
  }

  def main(args:Array[String]):Unit = {
    println("====================execise1=======================")
    println(LearnScala13.execise1("Mississippi"))

    println("====================execise2=======================")
    println(LearnScala13.execise2("Mississippi"))

    println("====================execise3=======================")
    var list3:mutable.ArrayBuffer[Integer] = new mutable.ArrayBuffer[Integer]
    list3 ++= ArrayBuffer(1,0,0,-1)
    println(LearnScala13.execise3(list3))

    println("====================execise4=========================")
    println(LearnScala13.execise4(Array("Tom","Fred","Harry"),Map("Tom"->3,"Dick"->4,"Harry"->5)))

    println("====================execise5=========================")
    println(LearnScala13.execise5(" or ",Array("1111","2222","3333")))

    println("====================execise8=========================")
    val arrs = LearnScala13.execise8(Array(1,2,3,4,5,6),3)
    for(elem <- arrs){
      println(elem.mkString(" "))
    }
  }
}