代码之家  ›  专栏  ›  技术社区  ›  Masterbuilder

在比较和条件检查之后添加列表值-Scala

  •  0
  • Masterbuilder  · 技术社区  · 6 年前

    我在一张单子里有三张单子。

    val l = List(List(1, 0, 0), List(1, 1, 0), List(1, 0, 1))
    

    现在的问题是用条件检查来添加列表中的值,基本上我需要检查每个元素的值,如果它们相等,则进行一些计算,如果不进行另一个计算。我厌倦了使用转置将相同的元素位置分组,然后映射结果并将当前元素与列表中的前一个元素进行比较,我认为最后一部分是我不清楚的地方。

    编辑:

    再解释一下,假设我们有这样的清单

        List(List(i1, j1, k1), List(i2, j2, k2), List(in, jn, kn)) 
    

    如果i1等于i2,则1+i1+i2*0.5,而j1等于j2,则1+j1+j2*.0.5,它将达到kn 第二个条件是如果它们不相等 i1不等于i2,则为下降,为i1+i2*0.5

    希望这个解释有帮助

    我要找的输出

    List[Double] = List(2.5, 0.5, 0.5)
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   jwvh    6 年前

    你的描述仍然很混乱,但我想也许这就是你想要的。

    val lst = List(List(1, 0, 0), List(1, 1, 0), List(1, 0, 1))
    
    lst.transpose
       .map(sublst => sublst.sum*0.5 + (if (sublst.forall(_==sublst.head)) 1 else 0))
    //res0: List[Double] = List(2.5, 0.5, 0.5)
    

    如果子列表的所有元素都相同,则添加 1 在计算中,否则添加 0 .

        2
  •  1
  •   RAGHHURAAMM    6 年前
    lst.transpose.map(v=>if(v.forall(_==v.head)) v.sum*0.5+1 else v.sum*0.5))
    

    lst.transpose.map(v=>if(v.exists(_!=v.head)) v.sum*0.5 else v.sum*0.5+1)
    

    lst.transpose.map(v=>if(v.find(_!=v.head)!=None) v.sum*0.5 else v.sum*0.5+1)
    

    这些是一般的,可以用来 two different expressions 对两种不同的情况进行评估,即。, all elements equal or not equal 打电话后在名单上 transpose 功能,即。,

    lst.transpose.map(v=>if(v.exists(_!=v.head)) 
                         (Expression1 in terms of elements in v) 
                         else (Expression2 in terms of elements in v) )
    

    在Scala REPL中: 因为,
    val lst = List(List(1, 0, 0), List(1, 1, 0), List(1, 0, 1))

    scala> lst.transpose.map(v=>if(v.forall(_==v.head)) v.sum*0.5+1 else v.sum*0.5)
    res23: List[Double] = List(2.5, 0.5, 0.5)
    
    scala> lst.transpose.map(v=>if(v.exists(_!=v.head)) v.sum*0.5 else v.sum*0.5+1)
    res24: List[Double] = List(2.5, 0.5, 0.5)
    
    scala> lst.transpose.map(v=>if(v.find(_!=v.head)!=None) v.sum*0.5 else v.sum*0.5+1)
    res25: List[Double] = List(2.5, 0.5, 0.5)
    
        3
  •  0
  •   Sebastian Celestino    6 年前

    可以使用地图和模式匹配

    val list = List(List(1, 0, 0), List(1, 1, 0), List(1, 0, 1))
    
    val result = list.transpose.map {
      case sublist if sublist.forall(sublist.head == _) => 1+0.5*sublist.sum
      case sublist => 0.5*sublist.sum
    }