it-swarm-ru.tech

Получить элемент в списке в Scala?

Как в мире вы получаете только элемент по индексу 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 не помогает, так как мои глаза просто пересекаются.

182
Andriy Drozdyuk

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

data(2)

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

268
Rex Kerr

Безопаснее использовать 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 и получить систему типов, которая поможет убедиться, что вы обрабатываете случай, когда элемент не существует.

Пояснение:

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

103
adamnfish

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

Вот цитата из книги программирование в 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)
9
B.Mr.W.

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

2
Deepan Chakravarthi