Làm cách nào để lấy chỉ mục hiện tại cho mỗi Kotlin


139

Làm thế nào để có được chỉ số trong một vòng lặp cho mỗi vòng lặp? Tôi muốn in số cho mỗi lần lặp thứ hai

Ví dụ

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

Trong java, chúng ta có vòng lặp truyền thống

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

Làm thế nào để có được i?


Câu trả lời:


303

Ngoài các giải pháp được cung cấp bởi @Audi, còn có forEachIndexed:

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

3
Wow tôi nghĩ rằng cái này tốt hơn ... Cảm ơn
Audi

1
Nó hoạt động trên Mảng và Iterables, bạn còn cần gì nữa để làm việc không?
zsmb13

Xin lỗi nhầm lẫn với mảng java nguyên thủy.
Audi

Bất kỳ cách để sử dụng breakbên trong?
Levon Petrosyan

Bạn không thể thoát khỏi toàn bộ vòng lặp, điều tương tự duy nhất bạn có thể làm là return@forEachIndexedvề cơ bản sẽ phục vụ như là continuebỏ qua phần tử tiếp theo. Nếu bạn cần ngắt, bạn phải bọc nó trong một hàm và sử dụng returntrong vòng lặp để trở về từ hàm kèm theo đó.
zsmb13

95

Sử dụng indices

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

Nếu bạn muốn giá trị cũng như chỉ mục Sử dụng withIndex()

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

Tham khảo: Dòng điều khiển trong kotlin


3
Tôi nghĩ câu trả lời này tốt hơn vì không cần phải học cái gì khác, chỉ đơn giản cho vòng lặp +1
underfilho

22

thử cái này; cho vòng lặp

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

4
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Phục hồi lại

Làm thế nào tôi có thể đặt một giới hạn cho vòng lặp này? Giống như nó đi cho đến một nửa hoặc một số số trước khi kết thúc
E.Akio


8

Dường như những gì bạn đang thực sự tìm kiếm là filterIndexed

Ví dụ:

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

Kết quả:

b
d

cũng xem xét sử dụng tham chiếu chức năng.forEach(::println)
Kirill Rakhman

@KirillRakhman, đang sử dụng chức năng tham chiếu kiểu ưa thích trong các tình huống như vậy? Tôi chưa quen với Kotlin, vì vậy tôi vẫn đang tìm ra thứ này.
Akavall

Tôi có xu hướng sử dụng chức năng tham khảo bất cứ khi nào có thể. Khi bạn có nhiều hơn một tham số, bạn lưu một loạt các ký tự so với sử dụng lambda. Nhưng đó là vấn đề của hương vị chắc chắn.
Kirill Rakhman

3

Phạm vi cũng dẫn đến mã có thể đọc được trong các tình huống như vậy:

(0 until collection.size step 2)
    .map(collection::get)
    .forEach(::println)

3
cách khác(0..collection.lastIndex step 2)
Kirill Rakhman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.