2010-04-11 11 views
90

स्काला में, आप अक्सर की तरह एक बढ़ते क्रम में एक for पाश करने के लिए एक इटरेटर का उपयोग करें:लूप के लिए नीचे या कमी स्केल?

for(i <- 1 to 10){ code } 

आप इसे कैसे करना होगा तो यह 1 से 10 से चला जाता है? मुझे लगता है कि 10 to 1 एक खाली इटरेटर (सामान्य श्रेणी गणित की तरह) देता है?

मैंने एक स्काला स्क्रिप्ट बनाई जो इसे इटरेटर पर रिवर्स कॉल करके हल करती है, लेकिन मेरी राय में यह अच्छा नहीं है, क्या जाने का तरीका निम्न है?

def nBeers(n:Int) = n match { 

    case 0 => ("No more bottles of beer on the wall, no more bottles of beer." + 
       "\nGo to the store and buy some more, " + 
       "99 bottles of beer on the wall.\n") 

    case _ => (n + " bottles of beer on the wall, " + n + 
       " bottles of beer.\n" + 
       "Take one down and pass it around, " + 
       (if((n-1)==0) 
        "no more" 
       else 
        (n-1)) + 
        " bottles of beer on the wall.\n") 
} 

for(b <- (0 to 99).reverse) 
    println(nBeers(b)) 

उत्तर

180
scala> 10 to 1 by -1 
res1: scala.collection.immutable.Range = Range(10, 9, 8, 7, 6, 5, 4, 3, 2, 1) 
+1

@ फ़ेलिक्स: आपका स्वागत है। मुझे यह भी बताया जाना चाहिए कि सीमा तक दाएं हाथ के अंतराल को बाहर करने के लिए '''' के स्थान पर आप 'तक' भी उपयोग कर सकते हैं। बाएं हाथ के अंतराल हमेशा शामिल है। –

+0

मुझे पहले से ही पता था, जब तक कि इंटीग्रर्स पर एक फ़ंक्शन भी नहीं है, हालांकि, "द्वारा" श्रेणी "पुनरावृत्ति" पर एक फ़ंक्शन होना चाहिए जो "से" और "जब तक" कार्यों से वापस आ जाता है। वैसे भी धन्यवाद :) – Felix

+3

रैंडल का जवाब सबसे अच्छा है, लेकिन मुझे लगता है कि 'Range.inclusive (10, 1, -1)' का उल्लेख उल्लेखनीय है। –

32

@Randall से जवाब सोने के रूप में अच्छा है, लेकिन पूरा होने की खातिर मैं विविधताओं के साथ जोड़ना चाहते थे: पास्कल में प्रोग्राम करने के बाद

scala> for (i <- (1 to 10).reverse) {code} //Will count in reverse. 

scala> for (i <- 10 to(1,-1)) {code} //Same as with "by", just uglier. 
+9

+1 पहले के लिए +1, लेकिन दूसरा एक बुरा है - 'बी'' से कम पठनीय और आईएमओ किसी भी परिस्थिति में इस्तेमाल नहीं किया जाना चाहिए –

+4

दूसरा एक बुरा है लेकिन – Zaheer

6

, मैं इस परिभाषा को खोजने उपयोग करने के लिए अच्छा:

:

implicit class RichInt(val value: Int) extends AnyVal { 
    def downto (n: Int) = value to n by -1 
    def downtil (n: Int) = value until n by -1 
} 

इस तरह से प्रयोग किया जाता है

for (i <- 10 downto 0) println(i) 
+0

पर उपलब्ध जानकारी के बारे में अंतर्ज्ञान बनाता है। मुझे इस समाधान का उपयोग करने में परेशानी हो रही है। यहां मेरा स्टैकट्रैक है: 'त्रुटि: (57, 17) मान वर्ग किसी अन्य वर्ग का सदस्य नहीं हो सकता है निहित वर्ग RichInt (वैल मान: Int) किसी भी Val { ^ ' – robert

+0

त्रुटि संदेश के रूप में (एक स्टैक ट्रेस नहीं) सुझाव देता है, आप किसी अन्य वर्ग के अंदर मूल्य वर्ग को परिभाषित नहीं कर सकते हैं। या तो इसे इसके बाहर परिभाषित करें, किसी ऑब्जेक्ट में ओइक करें, या 'AnyVal' भाग को बढ़ाएं (जो केवल कुछ ओवरहेड को हटाने के लिए कार्य करता है) को हटा दें। –

3

स्कैला लूप में नीचे काम करने के कई तरीके प्रदान करता है।

1 समाधान: के साथ "से" और

//It will print 10 to 0. Here by -1 means it will decremented by -1.  
for(i <- 10 to 0 by -1){ 
    println(i) 
} 

2 समाधान "द्वारा": के साथ "करने के लिए" और "रिवर्स"

for(i <- (0 to 10).reverse){ 
    println(i) 
} 

3 समाधान: के साथ "से" केवल

//Here (0,-1) means the loop will execute till value 0 and decremented by -1. 
for(i <- 10 to (0,-1)){ 
    println(i) 
} 
+2

इन सभी विकल्पों को पहले से ही कवर किया गया है (साल पहले)। – jwvh

संबंधित मुद्दे