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

时间:2018-07-28 00:05:03

标签: scala

列表中有三个列表。

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 个答案:

答案 0 :(得分:1)

您的描述仍然很混乱,但我想也许您正在追求这样的事情。

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

答案 1 :(得分:1)

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)

答案 2 :(得分:0)

您可以使用地图和图案匹配

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
}