2012-04-05 11 views
6

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

उदाहरण के लिए, यह एक ऐसा काम है जो मैं चाहता हूं। लेकिन अगर मैं नापसंद करता हूं।

क्या उनकी कतार का उपयोग करने का एक बेहतर तरीका है?

import scala.collection.immutable.Queue 

def printQ[A](p:Queue[A]) { 
    if(!p.isEmpty) { 
    p.dequeue match { 
     case (x,xs) => 
     println(x.toString) 
     printQ(xs) 
     case _ => 
     println("End")  
    } 
    }  
} 

printQ(Queue(1,2,4,5)) 

प्रतिक्रियाओं के लिए धन्यवाद।

उत्तर

3

Queue एक dequeueOption विधि है, जिसमें यह कुछ हद तक अच्छे होगा नहीं है। हालांकि, ध्यान दें कि आपके मैच में पहली प्रविष्टि संपूर्ण है; आप कभी भी println("End") कोड तक नहीं पहुंच सकते हैं। हमेशा से ही

p.foreach(println) 

सब कुछ बाहर मुद्रित करने के लिए,,

def printQ[A](p: Queue[A]) { 
    if (!p.isEmpty) p.dequeue match { 
    case (x,xs) => 
     println(x.toString) 
     printQ(xs) 
    } 
} 
बेशक

के बाद से यह सिर्फ क्रम में कतार पार करता एक कर सकते हैं: तो आप अपने संस्करण में सुधार कर सकते हैं।

+1

सिवाय इसके कि कतार क्रम में पुनरावृत्ति नहीं करती हैं। या वे वैसे भी, जरूरी नहीं है। –

+0

@ डैनियलसी। सोब्राल - अनुमोदित; ऑर्डर-समता 'अपरिवर्तनीय। क्यूयू' की एक अनियंत्रित विशेषता है। –

+0

'! P.isEmpty' को 'p.nonEmpty' द्वारा प्रतिस्थापित किया जा सकता है। यह अधिक सुंदर है;) – metch

2

आप case _ के लिए परीक्षण करने के लिए की जरूरत नहीं है:

scala> @annotation.tailrec def printQ[A](p:Queue[A]) { 
    | if(!p.isEmpty) { 
    |  p.dequeue match { 
    |  case (x,xs) => 
    |   println(x.toString) 
    |   printQ(xs) 
    |  } 
    | } 
    | } 
printQ: [A](p: scala.collection.immutable.Queue[A])Unit 

scala> printQ(Queue(1,2,4,5)) 
1 
2 
4 
5 

यह समारोह पुनरावर्ती होने के लिए आवश्यक है?

scala> for (i <- Queue(1, 2, 4, 5)) println(i) 
1 
2 
4 
5 
संबंधित मुद्दे