2016-10-14 3 views
0

написание функции в Scala, который принимает массив/кортежей/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

Ваша функция сортировки ничего не сортировать. Он просто берет первые два элемента из «Массив» и пытается создать из них «String». – jwvh

+0

sortfunction отмечает, но конкатенирует данные входы – BDR

ответ

1

Если вы знаете тип элемента в массиве [T], вы можете использовать шаблон соответствия (когда же типа). Но если вы не знаете, программа не может решить, как сортировать ваши данные.

Один из методов - это просто String, как показано ниже.

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) 
    } 
} 

Если вы хотите знать Tarit продукта, см http://www.scala-lang.org/api/rc2/scala/Product.html

+0

спасибо, что это было очень полезно – SumB

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]) 

Я просто предположил, что первым элементом в каждой части данных является «индекс», а второй - «имя». Я также предположил, что остальные элементы внутри всегда будут целыми числами и что может быть ноль, один или несколько из них, поэтому, следовательно, List (если это только нуль или один, лучшим выбором будет Option).

Тогда вы могли сортировать как:

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

или

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

спасибо, что работает отлично. – SumB