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

使用给定的零件尺寸列表将scala列表拆分为零件。[分区]

  •  2
  • RAGHHURAAMM  · 技术社区  · 6 年前

    我有两张单子:

    val list1:List[Int]   =  List(5, 2, 6)
    
    val list2:List[Any]  =  List("a", "b", "c", "d", "e", "f", "g", "h", "i", "j","k")
    

    如此 list1.sum >= list2.size

    我想要一个由list2中的元素组成的列表列表。 尺寸如清单1所示。

    例如:

    如果列表1是 List(5,2,4) 我想要的结果是:

    List(List("a", "b", "c", "d", "e"),List("f", "g"),List("h", "i", "j","k"))
    

    如果列表1是 List(5,4,6) 我想要的结果是:

    List(List("a", "b", "c", "d", "e"),List("f", "g","h", "i"),List("j","k"))
    

    我怎么能用简洁的代码做到这一点。

    4 回复  |  直到 6 年前
        1
  •  4
  •   jwvh    6 年前

    转弯 list2 变成一个 Iterator 然后映射到 list1 是的。

    val itr = list2.iterator
    list1.map(itr.take(_).toList)
    //res0: List[List[Any]] = List(List(a, b, c, d, e), List(f, g), List(h, i, j, k))
    

    更新 以下内容: 虽然这似乎给出了所需的结果,但在其他地方已经指出,重用迭代器实际上是不安全的,其行为也不能得到保证。

    经过一些修改,可以实现更安全的版本。

    val itr = list2.iterator
    list1.map(List.fill(_)(if (itr.hasNext) Some(itr.next) else None).flatten)
    

    import util.Try
    val itr = list2.iterator
    list1.map(List.fill(_)(Try(itr.next).toOption).flatten)
    
        2
  •  1
  •   prayagupa soxunyi    6 年前

    你可以切 list2 根据你的尺寸 list1 我是说,

      def main(args: Array[String]): Unit = {
    
        val groupingList: List[Int] = List(5, 2, 4)
        val data = List("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k")
    
        //0, 5
        //5, (5 + 2)
        //5 + 2, (5 + 2 + 4)
    
        val grouped = groupingList.zipWithIndex.map { case (_, index) =>
          val start = groupingList.slice(0, index).sum
          val end = groupingList.slice(0, index + 1).sum
    
          data.slice(start, end)
        }
    
        println(grouped)
      }
    

    结果: List(List(a, b, c, d, e), List(f, g), List(h, i, j, k))

    另请阅读: How slice works

        3
  •  1
  •   Manjitha Teshara    6 年前

    我喜欢用前男友 list1=列表(“一”、“二”、“三”) list[string]=列表(一,二,三)

    list2=列表(“红色”、“绿色”、“蓝色”) list[string]=列表(红色、绿色、蓝色)

    列表1::列表2 list[java.io.serializable]=list(list(一,二,三),红,绿,蓝)

    var listsum=列表1::列表2 list[java.io.serializable]=list(list(一,二,三),红,绿,蓝)

    列表总和 list[java.io.serializable]=list(list(一,二,三),红,绿,蓝)

    我们可以“:”将一个列表插入scala中的另一个列表

        4
  •  0
  •   RAGHHURAAMM    6 年前

    我刚刚发现,即使是下面的代码也能工作,但是jwvh发布的代码看起来比这更简洁,我理解在下面的代码中,将list1作为向量对于元素访问的性能来说更有意义:

    list1.scan(0)(_+_).sliding(2).toList.map(x=>list2.drop(x(0)).take(x(1)-x(0)))
    

    list1.scan(0)(_+_).zip(list1).map(x=>list2.drop(x._1).take(x._2))
    
    list1.scan(0)(_+_).sliding(2).map(x=>list2.slice(x(0),x(1))).toList