2013-05-07 4 views
3

Согласно документу для спискаразница между отсортированные и SortBy

def sorted[B >: A](implicit ord: math.Ordering[B]): List[A] 
Sorts this list according to an Ordering. 


def sortBy[B](f: (A) ⇒ B)(implicit ord: math.Ordering[B]): List[A] 

Sorts this List according to the Ordering which results from transforming an implicitly given Ordering with a transformation function. 

Когда вы используете один и когда бы вы использовать другой? Покрывает ли сценарий другой вариант?

ответ

6

Для SortBy вы можете поставить пользовательскую функцию, которая производит элементы, используемые для сортировки (например, сортировка по строке длины), тогда как для сортировки вы не можете:

val xs = List("aa", "b") 
// xs: List[String] = List(aa, b) 
xs.sortBy{ str => str.length } 
// List[String] = List(b, aa) 

// now usual lexicographical sorting 
xs.sorted 
// List[String] = List(aa, b) 
xs.sortBy(x => x) 
// List[String] = List(aa, b) 
xs.sortBy(identity) 
// List[String] = List(aa, b) 

, как вы можете видеть, последние три строки идентичны в их результат

+0

'xs.sorted (math.Ordering.by [String, Int] (_. Length))' – Debilski

+2

@Debilski, вы обманываете! ;-) –

+0

@ om-nom-nom отсортировано, вы можете передать пользовательский объект. Итак, когда пользовательский объект лучше, чем пользовательская функция? –

0

в качестве дополнения к @ ответ OM-NOM-NOM, в here является примером типичного использования двух:

val xs = List(4, 2, 3, 1) 
val ys = List((1, 1), (3, 2), (2, 3)) 
println(xs.sorted)  // List(1, 2, 3, 4) 
println(ys.sortBy(_._1)) // List((1,1), (2,3), (3,2)) 
3

Вы должны использовать sorted с Ordering, если вам нужно рассмотреть несколько случаев. Предположим, мы хотим отсортировать следующий список с самыми короткими строками в начале.

val xs = "aa" :: "b" :: "bb" :: "a" :: Nil 

xs.sortBy(_.length) 
> List[String] = List(b, a, aa, bb) 

Если мы хотим дополнительно отсортировать их в алфавитном порядке, если они имеют одинаковую длину, мы могли бы использовать sorted

xs.sorted(math.Ordering[(Int, String)].on((x: String) => (x.length, x))) 
> List[String] = List(a, b, aa, bb) 

Но опять же, мы могли бы использовать

xs.sortBy(x => (x.length, x)) 
> List[String] = List(a, b, aa, bb) 

, как Что ж.

Идея состоит в том, что вы можете предоставить классы классов Ordering для ваших собственных типов, а затем простой xs.sorted с таким неявным Ordering будет работать для наиболее распространенных случаев использования.

+0

Я смущен. Вы говорите, что вы должны быть в алфавитном порядке, но ваши результаты не являются. –

+0

Я хочу только сортировать их по алфавиту, когда они имеют одинаковую длину. – Debilski

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