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

如何用第二个序列的元素填充第一个序列

  •  1
  • addmeaning  · 技术社区  · 6 年前

    我有两个序列,第一个序列比第二个序列大或大小相同。

    例如 val first = 1 to 7 val second = Seq(3, 5) . 我想生成一个如下所示的序列:

    first |second| result
        1 |      |   3  
        2 |      |   3
        3 |   3  |   3
        4 |      |   3
        5 |   5  |   5
        6 |      |   5
        7 |      |   5   
    

    第二个示例:

    val first = 1 to 7
    val second = Seq(3, 5, 6)
    
    result will be Seq(3, 3, 3, 3, 5, 6, 6)
    

    我正在寻找一个普遍的解决方案。

    4 回复  |  直到 6 年前
        1
  •  2
  •   wrobel7    6 年前

    非常简单的一行解决方案。创建第二个列表的第一个元素和第二个列表中小于第一个列表的当前映射元素的所有元素的序列,并获取该序列中最大的元素。

    val first = 1 to 7
    val second = List(3, 5, 6)
    
    val result = (first.map(x => (second.head +: second.filter(_ <= x)).last))
    
        2
  •  1
  •   airudah    6 年前

    简单的方法:

    scala> val first = 1 to 7 toList
    first: List[Int] = List(1, 2, 3, 4, 5, 6, 7)
    
    scala> val second = List(3,5)
    second: List[Int] = List(3, 5)
    
    scala> val result = first.map(x => if(x < second.tail.head) second.head else second.tail.head)
    result: List[Int] = List(3, 3, 3, 3, 5, 5, 5)
    

    然而,这不是很灵活,但它满足了您的问题。

        3
  •  1
  •   addmeaning    6 年前

    我自己找到了解决办法。问题中的给定序列

    first.foldLeft((second, Seq.empty[Int])) { case ((sec, acc), f) =>
        if (sec.tail.isEmpty) (sec, sec.head +: acc)
        else if (f >= sec.tail.head) (sec.tail, sec.tail.head +: acc)
        else (sec, sec.head +: acc)
    }._2.reverse
    

    提供正确的结果

        4
  •  1
  •   Tom    6 年前

    使用递归解决方案 span

    @annotation.tailrec
    def recurse(first: Seq[Int], second: Seq[Int], acc: Seq[Int] = List.empty): Seq[Int] = {
      second match {
        case a :: b :: tail =>
          val (f1, f2) = first.span(_ != b)
          recurse(f2, b :: tail, List.fill(f1.length)(a) ++ acc)
        case a :: Nil =>
          (List.fill(first.length)(a) ++ acc).reverse
      }
    }
    
    val first = 1 to 7
    
    println(recurse(first, Seq(3, 5)))
    // List(3, 3, 3, 3, 5, 5, 5)
    
    println(recurse(first, Seq(3, 5, 6)))
    // List(3, 3, 3, 3, 5, 6, 6)