Existe alguma lista / sequência embutida que se comporta como map
e fornece o índice do elemento também?
99
Existe alguma lista / sequência embutida que se comporta como map
e fornece o índice do elemento também?
Eu acredito que você está procurando por 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
De: http://www.artima.com/forums/flat.jsp?forum=283&thread=243570
Você também tem variações como:
for((e,i) <- List("Mary", "had", "a", "little", "lamb").zipWithIndex) println(i+" "+e)
ou:
List("Mary", "had", "a", "little", "lamb").zipWithIndex.foreach( (t) => println(t._2+" "+t._1) )
zipWithIndex
método para obter o índice dentro de um loop / mapa / qualquer coisa.while
loop, que provavelmente está entre as opções mais rápidas.view
você deve ser capaz de evitar a criação e percorrer uma lista extra.Usar . mapa em. zipWithIndex
Resultado:
fonte
map
conforme solicitado em vez de apenas imprimir dentro de aforeach
.As soluções propostas sofrem do fato de criarem coleções intermediárias ou introduzirem variáveis que não são estritamente necessárias. Afinal, tudo o que você precisa fazer é controlar o número de etapas de uma iteração. Isso pode ser feito usando memoizing. O código resultante pode parecer
o
doIndexed
-Function envolve a função interior que recebe um índice e os elementos demyIterable
. Isso pode ser familiar para você do JavaScript.Aqui está uma maneira de atingir esse propósito. Considere o seguinte utilitário:
Isso já é tudo que você precisa. Você pode aplicar isso, por exemplo, da seguinte forma:
que resulta na lista
Desta forma, você pode usar as funções normais de Traversable à custa de empacotar sua função efetiva. A sobrecarga é a criação do objeto memoizing e do contador nele. Caso contrário, esta solução é tão boa (ou ruim) em termos de memória ou desempenho quanto usar não indexado
map
. Aproveitar!fonte
coll.view.zipWithIndex
vez decoll.zipWithIndex
Existe
CountedIterator
em 2.7.x (que você pode obter de um iterador normal com .counted). Eu acredito que ele foi descontinuado (ou simplesmente removido) no 2.8, mas é fácil de fazer o seu próprio. Você precisa ser capaz de nomear o iterador:fonte
Ou, supondo que sua coleção tenha tempo de acesso constante, você pode mapear a lista de índices em vez da coleção real:
fonte
ls.indices.map(i => doStuffWithElem(i, ls(i))
indices
está implementado0 until length
é praticamente a mesma coisa: PList
era realmente pobre. Eu mencionei, no entanto, que isso é adequado se sua coleção tiver tempo de acesso constante. Deveria ter escolhidoArray
.Use .map em .zipWithIndex com estrutura de dados Map
Resultados
fonte
Há duas maneiras de fazer isso.
ZipWithIndex: Cria um contador automaticamente começando com 0.
A saída de ambos os códigos será:
Zip : Use o método zip com um Stream para criar um contador. Isso fornece uma maneira de controlar o valor inicial.
Resultado:
fonte
Se você precisar pesquisar os valores do mapa também (como eu tive):
fonte