Есть ли какой-либо встроенный список / последовательность, который ведет себя как map
и также предоставляет индекс элемента?
99
Есть ли какой-либо встроенный список / последовательность, который ведет себя как map
и также предоставляет индекс элемента?
Я полагаю, вы ищете zipWithIndex?
scala> val ls = List("Mary", "had", "a", "little", "lamb")
scala> ls.zipWithIndex.foreach{ case (e, i) => println(i+" "+e) }
0 Mary
1 had
2 a
3 little
4 lamb
От: http://www.artima.com/forums/flat.jsp?forum=283&thread=243570
У вас также есть такие варианты, как:
for((e,i) <- List("Mary", "had", "a", "little", "lamb").zipWithIndex) println(i+" "+e)
или:
List("Mary", "had", "a", "little", "lamb").zipWithIndex.foreach( (t) => println(t._2+" "+t._1) )
zipWithIndex
метод для получения индекса внутри цикла / карты / чего угодно.while
циклом, который, вероятно, является одним из самых быстрых вариантов.view
you должно иметь возможность предотвратить создание и перемещение дополнительного списка.Используйте. карта в формате . zipWithIndex
Результат:
источник
map
как запрошенный, а не просто печатался внутриforeach
.Предлагаемые решения страдают тем фактом, что они создают промежуточные коллекции или вводят переменные, которые не являются строго необходимыми. В конечном итоге все, что вам нужно сделать, это отслеживать количество шагов итерации. Это можно сделать с помощью мемоизации. Результирующий код может выглядеть как
В
doIndexed
-Функция обертывания функции интерьера , который принимает как индекс в элементыmyIterable
. Это может быть вам знакомо по JavaScript.Вот способ достичь этой цели. Рассмотрим следующую утилиту:
Это уже все, что вам нужно. Вы можете применить это, например, следующим образом:
что приводит к списку
Таким образом, вы можете использовать обычные Traversable-функции за счет обертывания вашей эффективной функции. Накладные расходы - это создание мемоизирующего объекта и счетчика в нем. В противном случае это решение будет таким же хорошим (или плохим) с точки зрения памяти или производительности, как и неиндексированный
map
. Наслаждайтесь!источник
coll.view.zipWithIndex
вместоcoll.zipWithIndex
Есть
CountedIterator
в 2.7.x (который вы можете получить из обычного итератора с .counted). Я считаю, что он устарел (или просто удален) в версии 2.8, но его достаточно легко свернуть самостоятельно. Вам нужно иметь возможность назвать итератор:источник
Или, если ваша коллекция имеет постоянное время доступа, вы можете сопоставить список индексов вместо фактической коллекции:
источник
ls.indices.map(i => doStuffWithElem(i, ls(i))
indices
это реализовано, поскольку0 until length
это почти то же самое: PList
был действительно плохим. Однако я упомянул, что это подходит, если ваша коллекция имеет постоянное время доступа. Надо было выбратьArray
.Используйте .map в .zipWithIndex со структурой данных карты
Полученные результаты
источник
Это можно сделать двумя способами.
ZipWithIndex: автоматически создает счетчик, начиная с 0.
Вывод обоих кодов будет:
Zip : используйте метод zip с Stream, чтобы создать счетчик. Это дает вам возможность контролировать начальное значение.
Результат:
источник
Если вам также требуется поиск значений карты (как мне пришлось):
источник