Czy istnieje wbudowana lista / sekwencja, która zachowuje się jak map
i zapewnia również indeks elementu?
99
Czy istnieje wbudowana lista / sekwencja, która zachowuje się jak map
i zapewnia również indeks elementu?
Myślę, że szukasz 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
Od: http://www.artima.com/forums/flat.jsp?forum=283&thread=243570
Masz również odmiany, takie jak:
for((e,i) <- List("Mary", "had", "a", "little", "lamb").zipWithIndex) println(i+" "+e)
lub:
List("Mary", "had", "a", "little", "lamb").zipWithIndex.foreach( (t) => println(t._2+" "+t._1) )
zipWithIndex
metody, aby uzyskać indeks wewnątrz pętli / mapy / cokolwiek.while
pętli, która jest prawdopodobnie jedną z najszybszych opcji.view
ciebie powinno być w stanie zapobiec tworzeniu i przechodzeniu przez dodatkową listę.Posługiwać się . mapa w. zipWithIndex
Wynik:
źródło
map
żądanie zamiast po prostu drukowania wewnątrz plikuforeach
.Proponowane rozwiązania obarczone są tym, że tworzą zbiory pośrednie lub wprowadzają zmienne, które nie są bezwzględnie konieczne. Ostatecznie wszystko, co musisz zrobić, to śledzić liczbę kroków iteracji. Można to zrobić za pomocą zapamiętywania. Wynikowy kod może wyglądać tak
doIndexed
-Function owija funkcję wewnętrznego, który odbiera zarówno wskaźnik się elementówmyIterable
. Może to być znane z JavaScript.Oto sposób na osiągnięcie tego celu. Rozważ następujące narzędzie:
To już wszystko, czego potrzebujesz. Możesz to zastosować na przykład w następujący sposób:
co powoduje wyświetlenie listy
W ten sposób możesz używać zwykłych funkcji Traversable kosztem opakowywania efektywnej funkcji. Narzut to tworzenie obiektu do zapamiętywania i znajdującego się w nim licznika. W przeciwnym razie to rozwiązanie jest tak samo dobre (lub złe) pod względem pamięci lub wydajności, jak użycie niezindeksowanego
map
. Cieszyć się!źródło
coll.view.zipWithIndex
zamiastcoll.zipWithIndex
Jest
CountedIterator
w 2.7.x (który można uzyskać z normalnego iteratora z .counted). Wydaje mi się, że w wersji 2.8 został wycofany (lub po prostu usunięty), ale dość łatwo jest wprowadzić własny. Musisz być w stanie nazwać iterator:źródło
Lub zakładając, że Twoja kolekcja ma stały czas dostępu, możesz zmapować listę indeksów zamiast rzeczywistej kolekcji:
źródło
ls.indices.map(i => doStuffWithElem(i, ls(i))
indices
jest zaimplementowany, ponieważ0 until length
jest to prawie to samo: PList
był rzeczywiście kiepski. Wspomniałem jednak, że jest to odpowiednie, jeśli Twoja kolekcja ma stały czas dostępu. Powinienem był wybraćArray
.Użyj .map w .zipWithIndex ze strukturą danych Map
Wyniki
źródło
Można to zrobić na dwa sposoby.
ZipWithIndex: tworzy licznik automatycznie zaczynający się od 0.
Wynik obu kodów będzie:
Zip : użyj metody zip ze strumieniem, aby utworzyć licznik. Daje to sposób kontrolowania wartości początkowej.
Wynik:
źródło
Jeśli potrzebujesz przeszukać również wartości mapy (tak jak musiałem):
źródło