Получить элемент в списке в Scala? - PullRequest
182 голосов
/ 13 февраля 2011

Как в мире вы получаете только элемент по индексу i из списка в scala?

Я пробовал get(i), а [i] - ничего не работает.Поиск в Google возвращает только то, как «найти» элемент в списке.Но я уже знаю индекс элемента!

Вот код, который не компилируется:

def buildTree(data: List[Data2D]):Node ={
  if(data.length == 1){
      var point:Data2D = data[0]  //Nope - does not work

  }
  return null
}

Просмотр списка api не помогает, так какмои глаза просто пересекаются.

Ответы [ 4 ]

271 голосов
/ 13 февраля 2011

Используйте скобки:

data(2)

Но на самом деле вы не хотите делать это со списками очень часто, так как связанные списки требуют времени для обхода.Если вы хотите проиндексировать коллекцию, используйте Vector (неизменяемый) или ArrayBuffer (изменяемый) или, возможно, Array (который является просто массивом Java, за исключением того, что вы снова индексируете его с помощью (i) вместо * 1008).*).

103 голосов
/ 03 марта 2014

Безопаснее использовать lift, чтобы вы могли извлечь значение, если оно существует, и изящно потерпеть неудачу, если его нет.

data.lift(2)

Это вернет None, если список недостаточно длинный, чтобы предоставитьэтот элемент и Some (значение), если оно есть.

scala> val l = List("a", "b", "c")
scala> l.lift(1)
Some("b")
scala> l.lift(5)
None

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

Объяснение:

Это работает, потому что List 101 * * (который содержит только круглые скобки, например, l(index)).) подобна частичной функции, которая определяется везде, где в списке есть элемент.Метод List.lift превращает частичную функцию apply (функцию, которая определена только для некоторых входов) в обычную функцию (определенную для любого входа), в основном оборачивая результат в Option.

9 голосов
/ 30 октября 2015

Почему круглые скобки?

Вот цитата из книги программирование в scala .

Другая важная идея, проиллюстрированная этим примером, даст вам понимание того, почему массивы доступны в скобках в Scala.В Scala меньше особых случаев, чем в Java.Массивы - это просто экземпляры классов, как и любой другой класс в Scala.Когда вы применяете круглые скобки, окружающие одно или несколько значений, к переменной, Scala преобразует код в вызов метода с именем apply для этой переменной.Таким образом, greetStrings (i) преобразуется в greetStrings.apply (i).Таким образом, доступ к элементу массива в Scala - это просто вызов метода, как и любой другой.Этот принцип не ограничивается массивами: любое применение объекта к некоторым аргументам в скобках будет преобразовано в вызов метода apply.Конечно, это скомпилируется, только если этот тип объекта действительно определяет метод apply.Так что это не особый случай;это общее правило.

Вот несколько примеров, как вытащить определенный элемент (в данном случае первый элемент), используя стиль функционального программирования.

  // Create a multdimension Array 
  scala> val a = Array.ofDim[String](2, 3)
  a: Array[Array[String]] = Array(Array(null, null, null), Array(null, null, null))
  scala> a(0) = Array("1","2","3")
  scala> a(1) = Array("4", "5", "6")
  scala> a
  Array[Array[String]] = Array(Array(1, 2, 3), Array(4, 5, 6))

  // 1. paratheses
  scala> a.map(_(0))
  Array[String] = Array(1, 4)
  // 2. apply
  scala> a.map(_.apply(0))
  Array[String] = Array(1, 4)
  // 3. function literal
  scala> a.map(a => a(0))
  Array[String] = Array(1, 4)
  // 4. lift
  scala> a.map(_.lift(0))
  Array[Option[String]] = Array(Some(1), Some(4))
  // 5. head or last 
  scala> a.map(_.head)
  Array[String] = Array(1, 4)
2 голосов
/ 21 июня 2018

Пожалуйста, используйте скобки () для доступа к элементам списка list_name (index)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...