在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.
我做错了什么,或者我如何解决这个问题?我会很感激任何建议。
答案 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