2014-02-15 17 views
1

Я пытаюсь сохранить параметры, используемые для сортировки последовательности в Scala для последующего выполнения позже.Scala Сохранение параметров сортировки

Например, вместо «list.sortBy (.value)», я хочу, чтобы сохранить (« .value„) функции сортировки, и получить эту функцию сортировки (“_.value») на более поздней времени для фактической сортировки.

Как сохранить и получить аргументы функции сортировки для отложенного выполнения? Вот некоторые примеры кода тест:

class SortTest { 

    def testSort() = { 

    val myClass = new MyClass(0) 
    val list = List (myClass, new MyClass(1), new MyClass(2), new MyClass(3), new MyClass(4)) 

    // Want to sort by value attribute, but don't want to sort right away. Rather 
    // how do I save the sort function, and retrieve it at a later time for execution? 
    list.sortBy(_.value) 

    // save the sort function (i.e. sort by the value attribute of myClass) 
    // something similar to the following syntax 
    myClass.setSortFunction (_.value) 

    // retrieve the sort function and sort the list 
    list.sortBy(myClass.getSortFunction())   

    } 

    class MyClass (d:Int){ 
    val value = d 
    val sortFunc = null 

    // what should be the signature of this function ? 
    def setSortFunction (sortFunc:()) = { 
     this.sortFunc = sortFunc 
    } 

    // what should be the return type of this function? 
    def getSortFunction() = { 
     return sortFunc 
    } 

    } 

} 
+1

Почему бы вам просто не назначить эту функцию переменной? Почему вы не используете ленивые коллекции? Что вы пытаетесь выполнить, отложив сортировку? –

ответ

1

Вы могли бы сделать что-то вроде этого:

val sortFunction = (x : { def value: Int }) => x.value 

На данный момент, вы не могли бы быть счастливы с жестко прописывать в Int. К сожалению, функция должна иметь четко определенные типы, поэтому я не могу сделать этот общий тип возвращаемым.

Можно было бы вместо того, чтобы сделать это определение:

def sortFunction[T] = (x : { def value: T }) => x.value 

Однако, вы не можете передать определения вокруг, только значения, и значения не могут быть настроены параметры.

С другой стороны, вы приближаетесь к этому неправильно - есть предположение, что sortBy принимает функцию как параметр и только это. Не верно: sortBy принимает два параметра: функция и Ordering. Если вы не сохраните заказ, вы не сможете его отсортировать.

И здесь мы переходим к другой проблеме ... функция должна иметь тип MyClass => T, а заказ должен быть типа Ordering[T]. Не зная заранее, что такое T, вы не можете сохранить это.

К счастью, причина, по которой Ordering - хорошая идея, вы можете просто создать Ordering[MyClass] и использовать это!

Вот как:

class MyClass(d: Int) { 
    val value = d 
    private var sortFunction: Ordering[MyClass] = _ 
    def setSortFunction[T : Ordering](f: MyClass => T) { 
    sortFunction = Ordering by f 
    } 
    def getSortFunction = sortFunction 
} 

И использовать его как это:

list.sorted(myClass.getSortFunction) 

Обратите внимание, что вместо sortBy он использует sorted. Метод sortBy реализован путем создания Ordering и вызова sorted с ним, поэтому вы не теряете производительности.

Смежные вопросы