2014-04-15 3 views
3

다음 요구 사항을 사용하여 목록을 동적으로 정렬하는 깨끗한 방법을 찾고 있습니다.스칼라 동적 목록 정렬

case class Person(name: String, middleName:Option[String], age:Integer) 

는 이제 꽤 똑바로 앞으로 그러나 이런 종류의 사용자가 열 정렬 단순히 열 이름이됩니다 다시 서버에 전달 된 매개 변수를 할 것 UI를 구동하는 경우입니다 정렬. 이 정렬 기능을 동적으로 생성하기위한 제안 사항은 무엇입니까? 사전에

감사

** 업데이트 :

val sortByName = (p :Person) => p.name 
val sortByMiddleName = (p: Person) => p.middleName 

val mySortMap = Map("name" -> sortByName, "middleName" -> sortByMiddleName) 

val sorted = persons.sortBy(mySortMap("name")) 

** 업데이트 # 2

import scala.math.Ordering.Implicits._ 

type PersonSorter = (Person, Person) => Boolean 
val sortByName: PersonSorter = (x:Person, y:Person) => x.name < y.name 
// Implicits import takes care of the Option here... 
val sortByMiddleName: PersonSorter = (x:Person, y:Person) => x.middleName < y.middleName 

val sortingMap: PersonSorter = Map[String, PersonSorter]("name" -> sortByName, "middleName" -> sortByMiddleName) 

(제외 나이,하지만 똑같은 일이) 이제

내 목록이 있으면 쉽게 할 수 있습니다.

persons.sortWith(sortingMap("name")) 

여기서 "name"은 UI에서 전달 된 매개 변수 문자열입니다. 이 같은

답변

1

뭔가를 수행해야합니다

scala> val alice = Person("Alice", None, 20) 
alice: Person = Person(Alice,None,20) 

scala> val bob = Person("Bob", None, 21) 
bob: Person = Person(Bob,None,21) 

scala> val charlie = Person("Charlie", None, 18) 
charlie: Person = Person(Charlie,None,18) 

scala> val persons = List(alice, bob, charlie) 
persons: List[Person] = List(Person(Alice,None,20), Person(Bob,None,21), Person(Charlie,None,18)) 

scala> persons.sortBy(p => (p.age, p.name)) 
res5: List[Person] = List(Person(Charlie,None,18), Person(Alice,None,20), Person(Bob,None,21)) 

scala> persons.sortBy(p => (p.name, p.age)) 
res6: List[Person] = List(Person(Alice,None,20), Person(Bob,None,21), Person(Charlie,None,18)) 

동적 종류의 매개 변수에 의해 당신에게 입력으로 전달 된 매개 변수를 기반으로 자신의 정렬 기능을 정의 할 수 있습니다하십시오. 따라서 persons.sortBy에 전달되는 함수를 반환하는 함수를 작성할 수 있습니다. 전달 된 함수는 정렬 함수 (예 : sortByAge) 일 수 있습니다. 두 개 이상의 매개 변수로 정렬해야하는 경우 동일한 아이디어입니다.

scala> val sortByAge = (p :Person) => p.age 
sortByAge: Person => Integer = <function1> 

scala> persons.sortBy(sortByAge) 
res9: List[Person] = List(Person(Charlie,None,18), Person(Alice,None,20), Person(Bob,None,21)) 
+0

정확히 의미하지는 않지만이 부분을 잘 관리했습니다. 이것은 당신이 정렬하고자하는 것을 알고 있다는 가정하에 있습니다. 쿼리 매개 변수가 요청을 통해 sortBy = age로 오면 나이에 발생하도록 정렬이 필요하며 다음 요청은 sortBy = name이 될 수 있습니다. –

+0

@Colin 업데이트 된 답변을 참조하십시오. 'sortBy'는 정렬을 수행하는 함수를 취하여 입력으로 주어진 매개 변수를 기반으로 함수를 정의하고 전달할 수 있습니다. – Brian

+0

@ 브레인, 업데이트 된 답변을 주셔서 감사합니다. 업데이트 된 질문에서 내가하고있는 일을 할 수 있기를 바랬습니다. 나는 그것을 약간 다르게해야 할 것이다. 고마워, 나는 그 대답을 받아 들일 것이다. –