วิธีรับดัชนีปัจจุบันสำหรับแต่ละ Kotlin


156

จะรับดัชนีในแต่ละลูปได้อย่างไร? ฉันต้องการพิมพ์ตัวเลขสำหรับการทำซ้ำทุก ๆ วินาที

ตัวอย่างเช่น

for (value in collection) {
    if (iteration_no % 2) {
        //do something
    }
}

ใน java เรามีแบบดั้งเดิมสำหรับการวนซ้ำ

for (int i = 0; i < collection.length; i++)

วิธีการรับi?


คำตอบ:


346

นอกจากโซลูชันที่จัดทำโดย @Audi แล้วยังมีforEachIndexed:

collection.forEachIndexed { index, element ->
    // ...
}

3
ว้าวฉันคิดว่าอันนี้ดีกว่า ... ขอบคุณ
Audi

1
มันใช้งานได้กับ Arrays และ Iterables คุณต้องการอะไรอีกบ้างในการทำงาน
zsmb13

1
ขออภัยสับสนกับอาร์เรย์จาวาแบบดั้งเดิม
Audi

วิธีใช้ breakภายใน?
Levon Petrosyan

คุณไม่สามารถแยกออกจากลูปทั้งหมดได้สิ่งเดียวที่คุณทำได้คือreturn@forEachIndexedสิ่งเดียวที่จะทำหน้าที่เป็นหลักcontinueเพื่อข้ามไปยังองค์ประกอบถัดไป หากคุณต้องการทำลายคุณจะต้องรวมไว้ในฟังก์ชันและใช้returnในลูปเพื่อกลับจากฟังก์ชันปิดล้อมนั้น
zsmb13

103

ใช้ indices

for (i in array.indices) {
    print(array[i])
}

หากคุณต้องการค่าเช่นเดียวกับดัชนีใช้ withIndex()

for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

ข้อมูลอ้างอิง: Control-flow ใน kotlin


4
ฉันคิดว่าคำตอบนี้ดีกว่าเพราะไม่จำเป็นต้องเรียนรู้อย่างอื่นง่าย ๆ สำหรับการวนซ้ำ +1
underfilho

23

ลองดู สำหรับห่วง

for ((i, item) in arrayList.withIndex()) { }

5
แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่การให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือเหตุผลในการแก้ปัญหาจะช่วยเพิ่มมูลค่าในระยะยาวของคำตอบ
คืนสถานะ Monica

ฉันจะกำหนดขีด จำกัด สำหรับลูปนี้ได้อย่างไร?
กดไลค์


9

ดูเหมือนว่าสิ่งที่คุณกำลังมองหาจริงๆคือ filterIndexed

ตัวอย่างเช่น:

listOf("a", "b", "c", "d")
    .filterIndexed { index, _ ->  index % 2 != 0 }
    .forEach { println(it) }

ผลลัพธ์:

b
d

1
ลองใช้การอ้างอิงฟังก์ชันด้วย.forEach(::println)
Kirill Rakhman

@KirillRakhman ใช้ฟังก์ชันอ้างอิงสไตล์ที่ต้องการในสถานการณ์เช่นนั้นหรือไม่? ฉันยังใหม่กับ Kotlin ดังนั้นฉันจึงยังคงหาข้อมูลนี้อยู่
Akavall

ฉันมักจะใช้การอ้างอิงฟังก์ชันทุกครั้งที่ทำได้ เมื่อคุณมีพารามิเตอร์มากกว่าหนึ่งตัวคุณจะบันทึกอักขระจำนวนมากเมื่อเทียบกับการใช้แลมด้า แต่เป็นเรื่องของรสชาติอย่างแน่นอน
Kirill Rakhman


0

ตัวอย่างการทำงานforEachIndexedใน Android

ทำซ้ำด้วยดัชนี

itemList.forEachIndexed{index, item -> 
println("index = $index, item = $item ")
}

อัปเดตรายการโดยใช้ดัชนี

itemList.forEachIndexed{ index, item -> item.isSelected= position==index}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.