Если вам не нравятся фильтры и почтовые индексы, вы можете придерживаться понимания, но использовать его более функционально:
for {
rowIndex <- matrix.indices
if matrix(rowIndex)(nodeIndex)
} yield {
println("Row Index = " + rowIndex)
rowIndex
}
yield
создает новую коллекцию из результатовдля понимания, поэтому это выражение оценивает коллекцию, которую вы хотите вернуть.seq.indices
- это метод, эквивалентный 0 until seq.size
.С помощью фигурных скобок вы можете разделить несколько строк без точек с запятой, но вы можете сделать это в строке, если хотите:
for (rowIndex <- matrix.indices; if matrix(rowIndex)(nodeIndex)) yield rowIndex
Следует, вероятно, также упомянуть об этом, как правило, если вы перебираете массив, который вы выиграли 'Не нужно ссылаться на индексы вообще.Вы бы сделали что-то вроде
for {
row <- matrix
elem <- row
} yield f(elem)
, но ваш вариант использования немного необычен в том смысле, что он требует индексов элементов, с которыми вам обычно не следует беспокоиться (использование индексов массива по сутибыстрый и грязный хак для сопряжения элемента данных с номером).Если вы хотите захватить и использовать понятие положения, вам лучше использовать Map[Int, Boolean]
или case class
с таким полем.