Как в мире вы получаете элемент по индексу 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 не помогает, так как мои глаза просто пересекаются.
Ответы:
Используйте скобки:
Но вы действительно не хотите делать это со списками очень часто, так как связанные списки требуют времени для прохождения. Если вы хотите проиндексировать коллекцию, используйте
Vector
(неизменяемый) илиArrayBuffer
(изменяемый) или, возможно,Array
(который является просто массивом Java, за исключением того, что вы снова индексируете его(i)
вместо[i]
).источник
ArrayBuffer
работает какArrayList
.Vector
работает как неизменный -ArrayList
вы можете читать, но вы не можете написать без создания нового.ArrayBuffer
вIndexedSeq
использование.toIndexedSeq
;IndexedSeq
это более общий тип. (В этом случае фактически оказывается, что он реализован какVector
.)IndexedSeq
- это супертип коллекций, в которые целесообразно индексировать. Кроме того, обратите внимание, что вы можете сделатьVector() ++ myArrayBuffer
, что будет работать практически для любой коллекции (с обеих сторон).++
строит новую коллекцию из двух указанных вами, сохраняя тип слева.Vector()
это пустой вектор, поэтому он будет производить то, что вы хотите.Безопаснее использовать,
lift
чтобы вы могли извлечь значение, если оно существует, и изящно потерпеть неудачу, если его нет.Это вернет None, если список недостаточно длинный, чтобы предоставить этот элемент, и Some (значение), если это так.
Всякий раз, когда вы выполняете операцию, которая может потерпеть неудачу таким образом, замечательно использовать Option и получить систему типов, которая поможет убедиться, что вы обрабатываете случай, когда элемент не существует.
Объяснение:
Это работает, потому что List
apply
(который, например,l(index)
содержит только круглые скобки ) похож на частичную функцию, которая определяется везде, где в списке есть элемент.List.lift
Способ включает частичнуюapply
функцию (функцию , которая определена только для некоторых входов) в нормальную функцию (определенную для любого входного сигнала) по существу оберточного результата в качестве опции.источник
Почему круглые скобки?
Вот цитата из книги по программированию в Scala .
Вот несколько примеров, как вытащить определенный элемент (в данном случае первый элемент), используя стиль функционального программирования.
источник
Пожалуйста, используйте скобки () для доступа к элементам списка list_name (index)
источник
Это предпочтительный способ доступа к данным списка через индекс в настоящее время:
Но, как упоминал выше Рекс Керр: если вы используете индексы, вам следует рассмотреть возможность использования Vector вместо List.
источник