scala高次関数練習問題10題


1、高次関数を定義し、指定した規則に従って集合内の各要素を操作する.例えば、Array(「spark」,「hello」,「java」,「hadoop」)規則:集合内の各要素を操作し、集合の各要素の長さを得る
object Test01 {
     
  def main(args: Array[String]): Unit = {
     
    val list = Array("spark", "hello", "java", "hadoop")

    //    
    val fun = (s: String) => {
     
      s.length
    }
    println(doSome(list, fun))

    //    
    println(doSome(list, (s: String) => {
     
      s.length
    }))
    //    ,   
    println(doSome(list,(s)=>s.length))
    //     
    println(doSome(list,s=>s.length))
    // _
    println(doSome(list,_.length))

  }

  def doSome(list: Array[String], fun: (String) => Int) = {
     
    val res = for (elem  list) yield {
     
      fun(elem)
    }
    res.toList
  }
}

2、高次関数を定義し、データ中の要素を指定された規則に従ってフィルタリングする.例えば、Array(1,4,7,9,10,6,8)規則:偶数データのみを保持する
object Test02 {
     
  def main(args: Array[String]): Unit = {
     
    val list = Array(1,4,7,9,10,6,8)
    println(filter(list,(_%2==0)))
  }

  def filter(list: Array[Int],fun:(Int)=>Boolean) = {
     
  	// fun   ,  
    val res = for (elem  list if (fun(elem))) yield {
     
      elem
    }
    res.toList
  }
}

3、データの中の要素に対して指定の規則によってグループを分けます例えば:Array(“zhangsan shenzhen man”、“lisi beijing woman”、“zhaoliu beijing man”)の規則:住所によってグループを分けます
object Test03 {
     
  def main(args: Array[String]): Unit = {
     
    val list = Array("zhangsan shenzhen man","lisi beijing woman","zhaoliu beijing man")
    println(group(list,_.split(" ")(2)))
  }

  def group(list:Array[String],fun:(String)=>String) = {
     
    val map = new util.HashMap[String,util.ArrayList[String]]()
    for (elem  list) {
     
      val key = fun(elem)
      if(map.containsKey(key)){
     
        map.get(key).add(elem)
      }else{
     
        val value = new util.ArrayList[String]()
        value.add(elem)
        map.put(key,value)
      }
    }
    map
  }
}

4、指定されたルールに基づいて配列の最大要素を取得する.例えば、val list=Array(「zhangsan 30 3500」、「lisi 25 1800」、「zhaoliu 29 4500」、「qianqi 30 4500」)ルール:給料の高い人の情報を取得する.複数ある可能性がある
object Test04 {
     
  def main(args: Array[String]): Unit = {
     
    val list = Array("zhangsan 30 3500","lisi 25 1800","zhaoliu 29 4500","qianqi 30 4500")
    println(getMax(list,_.split(" ")(2 ).toInt))
  }

  def getMax(list:Array[String],fun:(String)=>Int) = {
     
    var max = fun(list(0))
    val res = new util.ArrayList[String]()
    for (elem  list) {
     
      val cru = fun(elem)
      if (max<cru) max = cru
    }
    //      
    for (elem  list) {
     
      val cru = fun(elem)
      if (max==cru) res.add(elem)
    }
    res
  }

}

5、指定されたルールに従って配列のすべての要素を集約します.例えば、Array(10,4,6,10,2)ルール:合計/積を求めます.
object Test05 {
     
  def main(args: Array[String]): Unit = {
     
    val list = Array(10,4,6,10,2)
    println(poly(list,_+_))
  }

  def poly(list:Array[Int],fun:(Int,Int)=>Int) = {
     
    var res = list(0)
    for (i1 until list.size) res = fun(res,list(i))
    res
  }
}

6、作成関数values(fun:(Int)=>Int,low:Int,high:Int)は、所与の区間内の所与の関数の入力と出力に対応する集合を出力する.例えば、values(x=>x*x,-5,5)は、対偶の集合(-5,25)、(-4,16)、(-3,9)、...、(5,25)を産むべきである.
object Test06 {
     
  def main(args: Array[String]): Unit = {
     
    println(values(x => x * x, -5, 5))
  }

  def values(fun: (Int) => Int, low: Int, high: Int)={
     
    val list = new util.ArrayList[String]()
    for (ilow to high){
     
      val res = fun(i.abs)
      list.add(s"(${i}, ${res})")
    }
    list
  }
}

7、配列中の最大要素を得る方法:var array=Array(1,2,3,4,5,6,7,8810012314444)
object Test07 {
     

  def main(args: Array[String]): Unit = {
     
    var array = Array(1,2,3,4,5,6,7,88,100,123,14444)
    val res = getMax(array,_-_)
    println(res)
  }

  def getMax(arr:Array[Int],fun:(Int,Int)=>Int) = {
     
    var max = arr(0)
    for (i 1 until  arr.length){
     
      val res = fun(max,arr(i))
      if (res < 0) max = arr(i)
    }
    max
  }

}

8、階乗関数を実現し、循環或いは再帰を使用してはならない
object Test08 {
     
  def main(args: Array[String]): Unit = {
     
    val res = factorial(4,_*_)
    println(res)
  }

  def factorial(n:Int,fun:(Int,Int)=>Int) = {
     
    var res = 1
    for (i 2 to n) res=fun(res,i)
    res
  }
}

9、関数largest(fun:(Int)=>Int,inputs:Seq[Int])を作成し、所与の入力シーケンスで所与の関数の最大値を出力する.例えば、largest(x=>10*x-x*x、1 to 10)は25を返すべきである.ループまたは再帰は使用できません
object Test09 {
     

  def main(args: Array[String]): Unit = {
     
    val res = largest(x => 10 * x - x * x, 1 to 10)
    println(res)
  }

  def largest(fun: (Int) => Int, inputs: Seq[Int]) = {
     
    var max = fun(inputs(0))
    for (elem  inputs) {
     
      val cru = fun(elem)
      if (cru>max) max = cru
    }
    max
  }

}

10、前の関数を修正し、最大の出力に対応する入力を返します.たとえばlargestAt(fun:(Int)=>Int,inputs:Seq[Int])は5を返すべきである.ループまたは再帰は使用できません
object Test10 {
     

  def main(args: Array[String]): Unit = {
     
    val res = largest(x => 10 * x - x * x, 1 to 10)
    println(res)
  }

  def largest(fun: (Int) => Int, inputs: Seq[Int]) = {
     
    var max = fun(0)
    var res = 0
    for (i 1 until  inputs.length) {
     
      val cru = fun(i)
      if (cru>max) {
     
        max = cru
        res = i
      }
    }
    res
  }

}