Scala数组的不同类型的值

时间:2016-10-14 07:31:39

标签: scala

在Scala中编写一个接受不同类型值的Array / Tuples / Seq的函数,并根据每个值中的前两个值对其进行排序:

def sortFunction[T](input: Array[T]) = input(0)+ " " + input(1)

我输入的值如下:

val data = Array((1, "alpha",88.9), (2, "alpha",77), (2, "beta"), (3, "alpha"), (1, "gamma",99))

然后我将sortFunction称为:

data.sortWith(sortFunction)

它给出了以下错误:

- polymorphic expression cannot be instantiated to expected type; found : [T]scala.collection.mutable.Seq[T] ⇒ Int required: ((Int, String)) ⇒ ? Error occurred in an application involving default arguments.
- type mismatch; found : scala.collection.mutable.Seq[T] ⇒ Int required: ((Int, String)) ⇒ ? Error occurred in an application involving default arguments.

我做错了什么,或者我如何解决这个问题?我会很感激任何建议。

2 个答案:

答案 0 :(得分:1)

如果你的Array个元组都具有相同的元素,例如(Int, String)的元组,那么你的排序函数可能看起来像

def sortFunction[T](fst: (Int, String), scd: (Int, String)) = fst._1 < scd._1 // sort by first element

但是,由于您有一个Array个不同arity的元组,Scala编译器只能将它放在最近的公共类型Product下。然后你可以像这样排序:

def sortFunction[T](fst: (Product), scd: (Product)) = fst.productElement(1).toString < scd.productElement(1).toString

val data = Array((1, "alpha", 99), (2, "alpha"), (2, "beta"), (3, "alpha"), (1, "gamma"))

data.sortWith(sortFunction) // List((1,alpha,99), (2,alpha), (3,alpha), (2,beta), (1,gamma))

请注意,这是非常糟糕的设计。您应该创建一个抽象数据类型,以更结构化的方式封装您的数据。我无法说出它应该是什么样子,因为我不知道你在哪里以及如何获得这些信息,但这是一个例子(称为Foo,但你当然应该有意义地命名):

case class Foo(index: Int, name: String, parameters: List[Int])

我只是假设每个数据中的第一个元素是&#34; index&#34;第二个是&#34; name&#34;。我还假设其中的其余元素总是整数,并且可能有零个,一个或多个,所以因此List(如果它只有零或一个,更好的选择会是Option)。

然后你可以排序为:

def sortFunction[T](fst: Foo, scd: Foo) = fst.index < scd.index

def sortFunction[T](fst: Foo, scd: Foo) = fst.name < scd.name

答案 1 :(得分:1)

如果您知道Array [T]中的元素类型,则可以使用模式匹配(当相同类型时)。但如果您不知道,程序无法决定如何对数据进行排序。

其中一种方法就是下面的字符串比较。

object Hello{
  def sortFunction[T](input1: T, input2: T) =
    input1 match {
      case t : Product =>
        val t2 = input2.asInstanceOf[Product]
        t.productElement(0).toString < t2.productElement(0).toString
      case v => input1.toString > input2.toString
    }
  def main(args: Array[String]): Unit = {


    val data = Array((1, "alpha",88.9), (2, "alpha",77), (2, "beta", 99), (3, "alpha"), (1, "gamma",99))

    println(data.sortWith(sortFunction).mkString)
  }
}

如果您想了解产品简介,请参阅http://www.scala-lang.org/api/rc2/scala/Product.html