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


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

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

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

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

  }
  return null
}

смотреть на!--12-- > список api не помогает, так как глаза просто крест.

4 158

4 ответа:

использовать круглые скобки:

data(2)

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

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

data.lift(2)

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

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

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

объяснение:

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

почему в скобках?

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

еще одна важная идея, проиллюстрированная в этом примере, даст вам представление о том, почему массивы доступны со скобками в Scala. Scala имеет меньше особых случаев, чем Java. Массивы-это просто экземпляры классов, как и любой другой класс в Scala. При применении круглых скобок, окружающих одно или несколько значений переменной, Scala преобразует код в вызов метода с именем apply для этой переменной. Таким образом, greetStrings(i) преобразуется в greetStrings.применить(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)

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