2011-04-18 14 views
38

क्या जावा 5 फोरैच लूप में पहले पुनरावृत्ति को छोड़ने का एक शानदार तरीका है?जावा फोरैच पहले पुनरावृत्ति को छोड़ दें

उदाहरण छद्म कोड:

for (Car car : cars) {  
    //skip if first, do work for rest 
    . 
    . 
} 
+4

संदर्भ के लिए है आपका कार्यक्रम केवल अमल होता है, Java5 नहीं 'नई' 5-6 साल के लिए किया गया है। – cHao

+0

मुझे संदेह है कि यह कुछ ऐसा है जो फोरैच लूप को स्पष्ट रूप से संभालने का इरादा नहीं था। – Doug

+0

मान लीजिए कि मुझे यह कहना चाहिए था * नया *: पी –

उत्तर

48

मैं इसे सुंदर, लेकिन शायद एक "प्रथम" बूलियन का उपयोग कर की तुलना में बेहतर फोन नहीं होगा:

for (Car car : cars.subList(1, cars.size())) 
{ 
    . 
    . 
} 

उसके अलावा, शायद कोई सुरुचिपूर्ण विधि ।  

+0

स्पष्ट रूप से यह केवल तभी काम करता है यदि आपके पास कोई सूची है :) –

+0

क्या सभी ऑर्डर किए गए संग्रह प्रकार और सरणी में ऐसा "सबसेट" प्रकार कमांड नहीं है? – RHSeeger

+0

@RHSeeger नहीं, मुझे ऐसा नहीं लगता है। मेरा मतलब है, एक सूची जो एक सूची सूची बनाता है वह तथ्य है कि इसे आदेश दिया गया है, तो आप एक अनियमित संग्रह के सबसेट की सीमा निर्दिष्ट कैसे कर सकते हैं? मुझे लगता है कि आप एक इटरेटर के पहले पुनरावृत्ति को छोड़ सकते हैं, लेकिन इस बात की कोई गारंटी नहीं होगी कि आप हमेशा वही तत्व छोड़ दें। –

1

सुरुचिपूर्ण? ज़रुरी नहीं। आपको बुलियन की जांच/सेट करने की आवश्यकता होगी।

प्रत्येक-लूप प्रत्येक व्यावहारिक उद्देश्यों के लिए एक पुनरावर्तक का उपयोग करने के लिए फैंसी वाक्यविन्यास के लिए है। आप अपने लूप को शुरू करने से पहले एक इटरेटर का उपयोग कर आगे बढ़ रहे हैं और आगे बढ़ रहे हैं।

3

मैं एक जावा व्यक्ति नहीं हूँ, लेकिन आप उपयोग कर सकते हैं:

for (Car car : cars.tail()) java.util से के माध्यम से Groovy JDK

+0

क्या यह मानता है कि कार एक सूची है? –

24
for (Car car : cars) 
{ 
    if (car == cars[0]) continue; 
    ... 
} 

सुरुचिपूर्ण काफी मेरे लिए।

+0

मुझे इस तरह से स्पष्ट लगता है ... और संभवतः एक बड़ी सूची पर बहुत तेज है? – noelicus

+1

जब तक एक तत्व दोहराया नहीं जाता है लेकिन लालित्य के लिए +1। – borjab

+0

मैं इसे सबसे अच्छे जवाब के लिए वोट देता हूं! :-) –

15

Seana के कोड एक छोटे त्रुटि है: sublist को दूसरा तर्क एक विशेष सूचकांक के रूप में व्यवहार किया जाता है, इसलिए हम बिल्कुल

for (Car car : cars.subList(1, cars.size()) { 
    ... 
} 

लिख सकते हैं (मैं जवाब पर टिप्पणी करने में सक्षम होने के लिए नहीं है, इसलिए । नया उत्तर मैं एक निश्चित प्रतिष्ठा की जरूरत है कि क्या करना  

+2

आपको अधिक प्रतिनिधि - अच्छी पकड़ की आवश्यकता हो सकती है। –

+2

अब आप [टिप्पणी] (http://stackoverflow.com/privileges/comment) में सक्षम होना चाहिए। – Ishtar

+1

धन्यवाद! उत्तर अपडेट –

6

मैं यह करने के लिए देर से एक सा आ गया है), लेकिन आप एक सहायक विधि का उपयोग कर सकता है, कुछ की तरह:

public static <T> Iterable<T> skipFirst(final Iterable<T> c) { 
    return new Iterable<T>() { 
     @Override public Iterator<T> iterator() { 
      Iterator<T> i = c.iterator(); 
      i.next(); 
      return i; 
     } 
    }; 
} 

और का उपयोग यह कुछ इस तरह:

public static void main(String[] args) { 
    Collection<Integer> c = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); 
    for (Integer n : skipFirst(c)) { 
     System.out.println(n); 
    } 
} 

सामान्यीकरण छोड़ने के लिए "n" पाठक :)


संपादित के लिए एक व्यायाम के रूप में छोड़ दिया जाता है: ध्यान से पर, मुझे लगता है कि देखने के अमरूद Iterables.skip(...)here है।

22

अमरूद Iterables.skip() का उपयोग करें।

कुछ की तरह:

for (Car car : Iterables.skip(cars, 1)) {  
    // 1st element will be skipped 
} 

(msandiford's answer के अंत से इस समझे और यह एक स्टैंडअलोन जवाब बनाना चाहते थे)

+1

मुझे यह दृष्टिकोण पसंद है - बहुत साफ है। धन्यवाद –

1

ऐसा नहीं है सुरुचिपूर्ण लेकिन iterators

Iterator<XXXXX> rows = array.iterator(); 
if (rows.hasNext()){ 
    rows.next(); 
} 
for (; rows.hasNext();) { 
    XXXXX row = (XXXXX) rows.next(); 
} 
28

के साथ के साथ काम नया जावा 8 Stream API यह वास्तव में बहुत ही सुरुचिपूर्ण हो जाता है।बस skip() विधि का उपयोग करें:

cars.stream().skip(1) // and then operations on remaining cars 
0

इस सुरुचिपूर्ण नहीं हो सकता है, लेकिन एक पाश के लिए बाहर एक पूर्णांक चर को प्रारंभ और पाश के भीतर हर यात्रा के साथ इसे बढ़ाने के सकता है। अगर काउंटर से बड़े 0.

int counter = 0; 
for (Car car : cars) { 
    //skip if first, do work for rest 
    if(counter>0){ 
     //do something 
    } 
    counter++; 
} 
संबंधित मुद्दे