Scala基础应用(7)- map/flatMap和filter

Scala基础应用(7)- map/flatMap和filter

本章主要介绍集合的map, flatten, flatMap, filter zip, fold, reduce等常用方法

map

map接受一个函数作为参数, 而此函数会接受一个参数为集合中元素, 所以此函数用于对集合中每一个元素进行处理后,产出其结果的集合。

val test = List("a", "b", "c")
test.map(x => x.toUpperCase)
或者 test.map(_.toUpperCase)

flatten

flatten 是将嵌套集合展开一层,注意Any类型的集合是不是展开的,但集合类型是可以展开的,即使是Any类型的集合类型。

List(List(List(1,2),List(3,4)), List(5,6)).flatten 可以展开一层,元法再次调用flatten进行再次展开,因为List(5,6)在第一次flatten时,已经展开,这个List会变成含有List和常数的List[Any]类型,下面可以进行再次展开

List(List(List(1,2),List(3,4)), List(List(5,6), List(7,8))).flatten.flatten  // 可以展开第二层

flatMap

flatMap实际上是对集合进行map, 然后将map函数处理的结果再flatten

List(List("a", "b"), List("c", "d")).flatMap (x => x)
与
List(List("a", "b"), List("c", "d")).flatten 返回的结果一样

只是前面一个式子中,x 参数是一个List集合

List(List(1,2),List(3,4)).flatMap(x=>x.map(x=>x*2))
通过上面这个式子,也可以看出x是集合,它有map功能,同时我们也能看出map返回的也是集合,而结果是展开的,所以可以理解为flatMap在执行完函数后,执行了flatten

filter

filter通过函数参数过滤掉函数返回false的元素

List("a", "b", "c").filter(x => x == "a")

zip

zip将两个集合进行合并,最终结果为较短集合的长度

val list1 = List("a", "b", "c", "d")
val list2 = List(1, 2, 3)
list1.zip(list2) 或者 list2.zip(list1)的长度都是3

可用zipAll来处理长度不同的两个集合,那如何处理较短的集合的填充呢?

list1.zipAll(list2, "填充1", "填充2")
如果list1较短,则用"填充1"填充,如果list2较短,则用"填充2"进行填充
上例将以"填充2"填充, 因为list2较短

fold

fold将集合元素进行处理,然后产生你想要的结果类型。

  • 样式

    集合变量.fold(初始值) { (累集结果变量,元素) => 处理函数体}
    
    如:
    List(1,2,3,4,5).fold(0) { (sum, item) => sum + item }
    返回15
    List(1,2,3,4,5).fold("a") { (sum, item) => sum + item.toString }
    返回 a12345
    
    注意:如果初始值类型和元素类型一至,返回类型也是该类型,否则为Any类型
  • foldLeft和foldRight分别从左开始fold和从右往左开始fold

    class Foo(val name: String, val age: Int, val genda: Symbol)
    object Foo {
        def apply(name: String, age: Int, genda: Symbol) = new Foo(name, age, genda)
    }
    
    val fooList = Foo("张三", 15, '男) :: Foo("李四", 20, '男) :: Foo("阿花", 18, '女) :: Nil
    
    val lst = fooList.foldLeft(List[String]()) {
        (z, f) =>
        val title = f.genda match {
            case '男 => "Mr."
            case '女 => "Ms."
        }
        println(z)
        z :+ s"$title ${f.name}, ${f.age}"
    }
    
    注意: foldLeft和foldRight产生的结果与初始值的类型相同
    
    另外:
    foldLeft的简写为 /:
    foldRight的简写为 :\
    
    (0/:(1 to 100)) (_+_)
    ((1 to 100) :\0) (_+_)

reduce

可以将reduce认为是fold的一种特殊情况,reduce的返回值类型必须与元素的类型相同

val list1 = List(1,2,3)
list1.reduce((sum,item) => sum + item)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shapley-Value是一种用于解决合作博弈成员收益分配问题的方法。在Scala,可以通过以下步骤来实现Shapley-Value的计算: 1. 定义一个表示玩家的类,包括以下属性:名称、对其他玩家的贡献函数、玩家的价值。 2. 定义一个表示游戏的类,包括以下属性:玩家列表、游戏收益函数。 3. 实现Shapley-Value的计算方法,该方法接受一个游戏对象和一个玩家名称作为参数。该方法通过对每个玩家进行排列组合,计算每个玩家在不同的联合决策的贡献,并将其加权平均,得出该玩家的Shapley-Value。 下面是一个简单的Scala实现: ```scala case class Player(name: String, contribution: List[Int], value: Int) class Game(val players: List[Player], val payoffFunction: List[Int] => Int) { def shapleyValue(playerName: String): Double = { val player = players.find(_.name == playerName).get val n = players.length val permutations = (1 to n-1).flatMap(i => (0 to n-2).combinations(i)) val contributions = permutations.map { indices => val subset = players.filter(p => indices.contains(players.indexOf(p))) val subsetPayoffFunction = (list: List[Int]) => payoffFunction(indices.map(list(_))) subsetPayoffFunction(indices.map(player.contribution(_))).toDouble } contributions.sum / factorial(n) } private def factorial(n: Int): Int = if (n == 1 || n == 0) 1 else n * factorial(n-1) } ``` 在这个实现,我们首先定义了一个Player类,其包含玩家的名称、对其他玩家的贡献函数和玩家的价值。然后,我们定义了一个Game类,其包含玩家列表和游戏收益函数。最后,我们实现了Shapley-Value的计算方法shapleyValue,该方法接受一个玩家名称作为参数,并返回该玩家的Shapley-Value。 在shapleyValue方法,我们首先找到了要计算Shapley-Value的玩家。然后,我们使用排列组合的方法计算每个玩家在不同联合决策的贡献,并将其加权平均得到该玩家的Shapley-Value。我们还实现了一个私有方法factorial,该方法计算阶乘,用于计算排列组合数。 注意:以上代码仅为示例,具体实现可能需要根据实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值