Список в scala -getting элемент с правой стороны - PullRequest
0 голосов
/ 21 февраля 2012

Я начал изучать scala, и мне интересно, есть ли способ получить элементы в Списке с правой стороны

Например,

val myList = List(1, 2, 3, 4, 5)

, если я напишу myList(-1) Iполучит 5.

Есть ли простой способ сделать это, или мне придется написать свою собственную функцию?

Ответы [ 4 ]

4 голосов
/ 21 февраля 2012
myList.last

? Помните, что эта операция имеет сложность O (n) для List. Также вы можете просто перевернуть список и использовать обычные индексы:

myList.reverse(0)
1 голос
/ 22 февраля 2012

Scala List является односвязным списком, и поэтому индексированный поиск по нему будет линейной операцией времени.Поскольку вас интересуют обратные индексы, вам также придется вызвать метод .length, который также является линейной временной операцией.

Если вам необходимо выполнить индексированный доступ, List, вероятно, не является подходящей структурой данных для использования.Вместо этого вы должны использовать Vector, который является типом последовательности с эффективным индексированным доступом (требует постоянного времени).

См. эту ссылку для обзора характеристик производительности различных коллекций Scala.

scala> val v = Vector(3, 4, 5, 2)
v: scala.collection.immutable.Vector[Int] = Vector(3, 4, 5, 2)

scala> v(v.length - 1)
res21: Int = 2
0 голосов
/ 22 февраля 2012

Чтобы сделать что-то вроде:

myList(-n)

Вы можете определить неявное преобразование, которое позволяет вам:

myList.getFromRight(n)

Здесьэто код для неявного преобразования.Он создаст новый метод getFromRight для всех Seqs, поэтому он будет работать со списками, векторами и т. Д.

implicit def getFromRightImpl[A](s: Seq[A]) = new {
  def getFromRight(n: Int) = s(s.length - n)
}

И вот несколько примеров:

scala> val v = Vector(1, 2, 3, 4)
v: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4)

scala> val l = List(1, 2, 3, 4)
l: List[Int] = List(1, 2, 3, 4)

scala> v.getFromRight(1)
res4: Int = 4

scala> l.getFromRight(3)
res5: Int = 2

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

0 голосов
/ 21 февраля 2012
myList(myList.length-1-index)

Обратите внимание, что myList.length имеет сложность O (n), а запрос определенного индекса имеет O (index).

...