Scala Concat排序的泛型序列

Scala Concat排序的泛型序列,scala,Scala,我需要连接两个通用序列,我试着这样做,但我知道这是错误的。我应该如何以正确的方式做这件事?我需要买新的Seq,它也会被订购的 object Main extends App{ val strings = Seq("f", "d", "a") val numbers = Seq(1,5,4,2) val strings2 = Seq("c", "b"); val strings3 = strings2.concat(strings) println(strings3) pr

我需要连接两个通用序列,我试着这样做,但我知道这是错误的。我应该如何以正确的方式做这件事?我需要买新的Seq,它也会被订购的

object Main extends App{
  val strings = Seq("f", "d", "a")
  val numbers = Seq(1,5,4,2)
  val strings2 = Seq("c", "b");
  val strings3 = strings2.concat(strings)
  println(strings3)
  println(numbers)
}


class Seq[T] private(initialElems: T*) {
  override def toString: String = initialElems.toString

  val elems = initialElems

  def concat(a:Seq[T]) = a.elems ++ this.elems
}

object Seq {
  def apply[T: Ordering](initialElems: T*): Seq[T] = new Seq(initialElems.sorted:_*)
}

不能使用++保持顺序来合并两个已排序的数组只需将一个序列粘贴到另一个序列的末尾

您需要从merge-sort算法中实现类似于merge的操作,并从合并的元素中创建新的Seq,而无需排序。 因此,您需要做3件事:

实现合并:

def mergea:Seq[T],b:Seq[T]:您的元素类型[T]=

实现创建Seq实例的新方法,无需在object Seq中排序:

def FROMSORTEDINITALLEMS:T*:序列[T]=新序列初始元素:_*

毕竟,您的concat可以实现为合成合并和fromSorted:

def concata:Seq[T]:Seq[T]=Seq.fromSortedmergethis,a


阅读有关合并排序的详细信息

使用++保持顺序无法合并两个已排序数组只需将一个序列粘贴到另一个序列的末尾

您需要从merge-sort算法中实现类似于merge的操作,并从合并的元素中创建新的Seq,而无需排序。 因此,您需要做3件事:

实现合并:

def mergea:Seq[T],b:Seq[T]:您的元素类型[T]=

实现创建Seq实例的新方法,无需在object Seq中排序:

def FROMSORTEDINITALLEMS:T*:序列[T]=新序列初始元素:_*

毕竟,您的concat可以实现为合成合并和fromSorted:

def concata:Seq[T]:Seq[T]=Seq.fromSortedmergethis,a


阅读有关合并排序的更多信息

您可以创建一个函数,该函数将遍历两个列表,获取两个列表的标题并进行比较,然后将适当的标题附加到结果列表中。然后,接下来的两个头应该重复,直到一个列表结束

下面是一个示例:

import scala.annotation.tailrec

def merge[A](a: List[A], b: List[A])(implicit ordering: Ordering[A]): List[A] = {

  @tailrec
  def go(a: List[A], b: List[A], acc: List[A] = Nil): List[A] = {

    (a, b) match {
      case (ax :: as, bx :: bs) => if(ordering.compare(ax, bx) < 0) go(as, bx :: bs, ax :: acc) else go(ax :: as, bs, bx :: acc)
      case (Nil, bs) => acc.reverse ++ bs
      case (as, Nil) => acc.reverse ++ as
      case _ => acc.reverse
    }

  }

  go(a, b)

}

val strings = List("a", "d", "f")
val strings2 = List("b", "c")
merge(strings, strings2) // List(a,b,c,d,e)


我用List代替Seq。您不应该使用Seq,这是一种非常通用的类型,而应该使用更具体的集合类型,它最适合您的任务,如Vector、List、ArraySeq等。

您可以创建一个函数,该函数将遍历两个列表,获取两个列表的标题并进行比较,然后将适当的标题添加到结果列表中。然后,接下来的两个头应该重复,直到一个列表结束

下面是一个示例:

import scala.annotation.tailrec

def merge[A](a: List[A], b: List[A])(implicit ordering: Ordering[A]): List[A] = {

  @tailrec
  def go(a: List[A], b: List[A], acc: List[A] = Nil): List[A] = {

    (a, b) match {
      case (ax :: as, bx :: bs) => if(ordering.compare(ax, bx) < 0) go(as, bx :: bs, ax :: acc) else go(ax :: as, bs, bx :: acc)
      case (Nil, bs) => acc.reverse ++ bs
      case (as, Nil) => acc.reverse ++ as
      case _ => acc.reverse
    }

  }

  go(a, b)

}

val strings = List("a", "d", "f")
val strings2 = List("b", "c")
merge(strings, strings2) // List(a,b,c,d,e)


我用List代替Seq。您不应该使用Seq,这是一种非常通用的类型,而应该使用更具体的集合类型,它最适合您的任务,如Vector、List、ArraySeq等。

您具体的问题是什么?您有一些代码,但为了帮助我们,我们需要知道您是如何专门尝试解决此问题的,以及什么不起作用。对于此示例,我想让strings3=a,b,c,d,fw您具体的问题是什么?您有一些代码,但为了帮助我们,我们需要知道您是如何专门尝试解决此问题的,以及什么不起作用