प्रत्येक कोटलीन के लिए वर्तमान सूचकांक कैसे प्राप्त करें


141

प्रत्येक लूप के लिए सूचकांक कैसे प्राप्त करें? मैं हर दूसरे पुनरावृत्ति के लिए नंबर प्रिंट करना चाहता हूं

उदाहरण के लिए

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

जावा में, हमारे पास लूप के लिए पारंपरिक है

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

कैसे प्राप्त करें i?


1
यह भी देखें stackoverflow.com/questions/46825787/…
s1m0nw1

जवाबों:


307

@ औदी द्वारा प्रदान किए गए समाधानों के अलावा, वहाँ भी है forEachIndexed:

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

3
वाह मुझे लगता है कि यह एक बेहतर है ... धन्यवाद
ऑडी

1
यह Arrays और Iterables पर काम करता है, आपको इसे काम करने के लिए और क्या चाहिए?
zsmb13

1
क्षमा करें, आदिम जावा सरणियों के साथ भ्रमित।
ऑडी

किसी भी तरह से breakअंदर का उपयोग करने के लिए ?
लेवॉन पेट्रोसियन

आप पूरे लूप से नहीं टूट सकते, केवल एक ही चीज आप कर सकते हैं return@forEachIndexedजो अनिवार्य रूप continueसे अगले तत्व को छोड़ना है। यदि आपको तोड़ने की आवश्यकता है, तो आपको इसे एक फ़ंक्शन में लपेटना होगा, और returnउस एन्कोडिंग फ़ंक्शन से लौटने के लिए लूप में उपयोग करना होगा।
zsmb13

96

उपयोग indices

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

यदि आप मूल्य और साथ ही सूचकांक का उपयोग करना चाहते हैं withIndex()

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

संदर्भ: कोटलिन में नियंत्रण-प्रवाह


3
मुझे लगता है कि यह उत्तर बेहतर है क्योंकि कुछ और सीखने की ज़रूरत नहीं है, बस लूप +1 के लिए सरल है
अंडरफिल्हो

22

इसे इस्तेमाल करे; पाश के लिए

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

4
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह समस्या का हल कैसे और / या इसके बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे उत्तर के दीर्घकालिक मूल्य में सुधार होगा।
मोनिका

मैं इस लूप के लिए एक सीमा कैसे रख सकता हूं? जैसे यह अंत से पहले आधे या कुछ संख्याओं तक चला जाता है
E.Akio


9

ऐसा लगता है कि आप वास्तव में क्या देख रहे हैं filterIndexed

उदाहरण के लिए:

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

परिणाम:

b
d

1
एक फ़ंक्शन संदर्भ का उपयोग करने पर भी विचार करें.forEach(::println)
किरिल राख़्मन

@KirillRakhman, फ़ंक्शन संदर्भों का उपयोग उस तरह की स्थितियों में पसंदीदा शैली कर रहा है? मैं कोटलिन के लिए नया हूं, इसलिए मैं अभी भी इस सामान का पता लगा रहा हूं।
17

जब भी संभव हो मैं फ़ंक्शन संदर्भों का उपयोग करता हूं। जब आपके पास एक से अधिक पैरामीटर होते हैं, तो आप लैम्बडा का उपयोग करने की तुलना में वर्णों का एक समूह बचाते हैं। लेकिन यह सुनिश्चित करने के लिए स्वाद की बात है।
किरिल रहमान

3

रेंज भी ऐसी स्थितियों में पठनीय कोड के लिए नेतृत्व:

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

3
वैकल्पिक रूप से(0..collection.lastIndex step 2)
किरिल रहमान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.