스칼라에서 역 정렬을 수행하는 가장 좋은 방법은 무엇입니까? 다음이 다소 느리다고 생각합니다.
list.sortBy(_.size).reverse
sortBy를 사용하지만 반대 정렬을 얻는 편리한 방법이 있습니까? 오히려 사용할 필요가 없습니다 sortWith
.
답변
숫자 값으로 정렬하면 부호를 변경하는 확실한 방법이있을 수 있습니다.
list.sortBy(- _.size)
더 일반적으로, 정렬은 암시 적 순서로 정렬 된 방법으로 수행 될 수 있으며, 명시 적으로 만들 수 있으며 순서는 반대입니다 (아래의 목록이 아님).
list.sorted(theOrdering.reverse)
역순으로 정렬하려는 순서가 암시 적 순서 인 경우, 암시 적으로 [주문 [A]] (주문하려는 유형) 또는 더 나은 순서 [A]로 주문할 수 있습니다. 그건
list.sorted(Ordering[TheType].reverse)
sortBy는 Ordering.by를 사용하는 것과 같습니다.
list.sorted(Ordering.by(_.size).reverse)
아마도 가장 짧은 글은 아니지만 (마이너스에 비해) 의도는 분명 할 것입니다
최신 정보
마지막 줄이 작동하지 않습니다. _
in 을 수락하려면 Ordering.by(_.size)
컴파일러에서 어떤 유형을 주문하는지 알아야하므로을 입력 할 수 있습니다 _
. 목록의 요소 유형이 될 수도 있지만 sorted의 서명이 그렇기 때문에 그렇지 않습니다
def sorted[B >: A](ordering: Ordering[B])
. 의 주문은에있을 수 A
있지만의 조상에 A
있을 수도 있습니다 (사용 가능 byHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). 실제로,리스트가 공변량이라는 사실은이 서명을 강요합니다. 하나는 할 수 있습니다
list.sorted(Ordering.by((_: TheType).size).reverse)
그러나 이것은 훨씬 덜 유쾌합니다.
답변
list.sortBy(_.size)(Ordering[Int].reverse)
답변
어쩌면 조금 더 단축시킬 수도 있습니다.
def Desc[T : Ordering] = implicitly[Ordering[T]].reverse
List("1","22","4444","333").sortBy( _.size )(Desc)
답변
쉬운 peasy (최소한의 경우 size
) :
scala> val list = List("abc","a","abcde")
list: List[java.lang.String] = List(abc, a, abcde)
scala> list.sortBy(-_.size)
res0: List[java.lang.String] = List(abcde, abc, a)
scala> list.sortBy(_.size)
res1: List[java.lang.String] = List(a, abc, abcde)
답변
sortBy
ord
순서를 제공하는 암시 적 매개 변수 가 있음
def sortBy [B] (f: (A) ⇒ B)(implicit ord: Ordering[B]): List[A]
그래서 우리는 자신의 Ordering
객체를 정의 할 수 있습니다
scala> implicit object Comp extends Ordering[Int] {
| override def compare (x: Int, y: Int): Int = y - x
| }
defined module Comp
List(3,2,5,1,6).sortBy(x => x)
res5: List[Int] = List(6, 5, 3, 2, 1)
답변
모두 sortWith
와 것은 sortBy
소형 구문이 :
case class Foo(time:Long, str:String)
val l = List(Foo(1, "hi"), Foo(2, "a"), Foo(3, "X"))
l.sortWith(_.time > _.time) // List(Foo(3,X), Foo(2,a), Foo(1,hi))
l.sortBy(- _.time) // List(Foo(3,X), Foo(2,a), Foo(1,hi))
l.sortBy(_.time) // List(Foo(1,hi), Foo(2,a), Foo(3,X))
sortWith
이해하기 쉬운 것을 찾았습니다 .
답변
val list = List(2, 5, 3, 1)
list.sortWith(_>_) -> res14: List[Int] = List(5, 3, 2, 1)
list.sortWith(_<_) -> res14: List[Int] = List(1, 2, 3, 5)