Методы списка Scala: `удалить` и `сортировать`

#scala

#scala

Вопрос:

Я работаю над «Программированием в Scala (первое издание)», и я добрался до некоторых методов списка. Есть два метода, которые он называет, которые выдают мне ошибку в интерактивной оболочке: удалить и отсортировать. Вот примеры, которые он дает:

 val thrill = "will" :: "fill" :: "until" :: Nil

thrill.sort((a, b) a.charAt(0).toLowerCase < b.charAt(0).toLowerCase)

thrill.remove(s => s.length == 4)
  

Когда я пытаюсь использовать их в консоли, я получаю ошибки, которые эти методы не являются « a member of List[String] «:

 scala> util.Properties.versionString
res41: String = version 2.11.1

scala> val myList = "one" :: "two" :: "three" :: "four" :: Nil
myList: List[String] = List(one, two, three, four)

scala> myList.sort((a, b) => a.charAt(0).toLowerCase < b.charAt(0).toLowerCase)
<console>:9: error: value sort is not a member of List[String]
              myList.sort((a, b) => a.charAt(0).toLowerCase < b.charAt(0).toLowerCase)
                     ^

scala> thrill.remove(s => s.length == 5)
<console>:9: error: value remove is not a member of List[String]
              thrill.remove(s => s.length == 5)
  

Поэтому я подумал, что, возможно, я использую более новую версию (поскольку эта книга, похоже, написана несколько лет назад), и я обратился к документации по списку. Оба метода, по-видимому, присутствуют в версии 2.7.7 (самой новой, которую я смог найти). Как вы можете видеть, я использую 2.11.1.

Были ли эти методы удалены из API списков с 2.7.7, или я использую их неправильно?

Комментарии:

1. Странно, что 2.7 — это новейшая документация, которую вы можете найти, моя версия всплывающих окон Google, последняя версия scala

Ответ №1:

В темные времена scala 2.7 (это было более четырех лет назад!) ваш код будет работать просто отлично, но теперь, с 2.8 , вам придется использовать разные имена для remove и sort :

 import Character.{toLowerCase => lower}
myList.sortWith { case (a, b) => lower(a.charAt(0)) < lower(b.charAt(0)) }
// List(four, one, two, three)
  

Существует также .sorted для сортировки по умолчанию

 List(2, 5, 3).sorted
// res10: List[Int] = List(2, 3, 5)
  

и .sortBy(x => …) для сортировки с некоторой подготовкой (это похоже на сортировку с помощью эфемерной карты):

 val foo = List("ac", "aa", "ab")
foo.sortBy(x => x.charAt(1))
// res6: List[String] = List(aa, ab, ac)
  

И remove был заменен на filterNot (хотя, я думаю, что remove — более удобное имя, даже если это заставляет вас думать, что коллекция изменчива, что обманывает Ven в его ответе):

 thrill.filterNot(s => s.length == 5)
// res9: List[String] = List(will, fill)
  

Существует также .filter, который делает обратное:

 thrill.filter(s => s.length == 5)
// res11: List[String] = List(until)
  

Это можно увидеть гораздо чаще в коде scala.