Apakah ada List / Sequence built-in yang berperilaku seperti map
dan menyediakan indeks elemen juga?
99
Apakah ada List / Sequence built-in yang berperilaku seperti map
dan menyediakan indeks elemen juga?
Saya yakin Anda sedang mencari 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
Dari: http://www.artima.com/forums/flat.jsp?forum=283&thread=243570
Anda juga memiliki variasi seperti:
for((e,i) <- List("Mary", "had", "a", "little", "lamb").zipWithIndex) println(i+" "+e)
atau:
List("Mary", "had", "a", "little", "lamb").zipWithIndex.foreach( (t) => println(t._2+" "+t._1) )
zipWithIndex
metode untuk mendapatkan indeks di dalam loop / map / apapun.while
loop, yang mungkin merupakan salah satu opsi tercepat.view
Anda harus dapat mencegah pembuatan dan melintasi Daftar tambahan.Gunakan. memetakan . zipWithIndex
Hasil:
sumber
map
seperti yang diminta alih-alih hanya mencetak di dalam fileforeach
.Solusi yang diusulkan menderita karena mereka membuat koleksi perantara atau memasukkan variabel yang tidak terlalu diperlukan. Karena pada akhirnya yang perlu Anda lakukan adalah melacak jumlah langkah iterasi. Ini dapat dilakukan dengan menggunakan memoizing. Kode yang dihasilkan mungkin terlihat seperti ini
The
doIndexed
-Fungsi membungkus fungsi interior yang menerima indeks dan elemenmyIterable
. Ini mungkin tidak asing bagi Anda dari JavaScript.Inilah cara untuk mencapai tujuan ini. Pertimbangkan utilitas berikut:
Ini sudah semua yang Anda butuhkan. Anda dapat menerapkan ini misalnya sebagai berikut:
yang menghasilkan daftar
Dengan cara ini, Anda dapat menggunakan fungsi Traversable biasa dengan mengorbankan fungsi efektif Anda. Overhead adalah pembuatan objek memo dan penghitung di dalamnya. Jika tidak, solusi ini sama baiknya (atau buruk) dalam hal memori atau kinerja seperti menggunakan tidak terindeks
map
. Nikmati!sumber
coll.view.zipWithIndex
bukannyacoll.zipWithIndex
Ada
CountedIterator
di 2.7.x (yang bisa Anda dapatkan dari iterator normal dengan .counted). Saya yakin ini sudah usang (atau hanya dihapus) di 2.8, tetapi cukup mudah untuk menggulirnya sendiri. Anda harus dapat memberi nama iterator:sumber
Atau, dengan asumsi koleksi Anda memiliki waktu akses konstan, Anda dapat memetakan daftar indeks alih-alih koleksi sebenarnya:
sumber
ls.indices.map(i => doStuffWithElem(i, ls(i))
indices
diimplementasikan karena0 until length
hampir sama: PList
memang buruk. Namun saya menyebutkan bahwa ini cocok jika koleksi Anda memiliki waktu akses yang konstan. Seharusnya memilihArray
.Gunakan .map di .zipWithIndex dengan struktur data Map
Hasil
sumber
Ada dua cara untuk melakukan hal ini.
ZipWithIndex: Membuat penghitung secara otomatis dimulai dengan 0.
Output dari kedua kode tersebut adalah:
Zip : Gunakan metode zip dengan Stream untuk membuat penghitung. Ini memberi Anda cara untuk mengontrol nilai awal.
Hasil:
sumber
Jika Anda perlu mencari nilai peta juga (seperti saya harus):
sumber