2013-05-09 3 views
6

के प्रत्येक तत्व पर ट्रिम कॉल करने के लिए मुझे एक ऐसा फ़ंक्शन लिखना होगा जो किसी भी आकार की टुपल स्ट्रिंग लेता है, प्रत्येक तत्व पर ट्रिम कॉल करता है और एक नया ट्यूपल देता है। मैं नीचे इस बिंदु पर फंस गया हूं और कोड पहले से ही सुरक्षित नहीं है। इसके अलावा मुझे नहीं पता कि एक बार जब मैं इसे एक इटरेटर में परिवर्तित करता हूं तो टुपल पर वापस कैसे जाना है। क्या इस समस्या को हल करने का एक और शानदार तरीका है? समाधान (, निराकार मामले में कम से कम) स्काला 2.9.2स्कैला: ट्यूपल

def trim(input:Product)={ 
    input.productIterator.asInstanceOf[Iterator[String]].map(_.trim) 
    } 
+4

आकारहीन या इससे भी बेहतर का उपयोग करें: एक सूची – sschaef

+0

यह पोस्ट इटरेटर को टुपल पर वापस लाने में मदद कर सकती है: http://stackoverflow.com/questions/11305290/is-there-way-to-create-tuple-from -listwithout-codegeneration – cmbaxter

+1

आपके पास "किसी भी आकार" के टुपल्स नहीं हो सकते हैं, केवल 22 तक। समान प्रकार की वस्तुओं की मनमानी संख्याओं के लिए, लगभग किसी अन्य संग्रह का उपयोग करें: सूची, वेक्टर, ऐरे, आदि .. –

उत्तर

16

आप एक समाधान Shapeless का उपयोग करता है के साथ जाने को तैयार हैं, पर काम करने की जरूरत है, यह बिल्कुल स्पष्ट है:

import shapeless._ 

object trimmer extends (String -> String)(_.trim) 

def trim[T <: Product, L <: HList](t: T)(implicit 
    hlister: HListerAux[T, L], 
    toList: ToList[L, String], 
    mapper: MapperAux[trimmer.type, L, L], 
    tupler: TuplerAux[L, T] 
) = hlister(t).map(trimmer).tupled 

और फिर:

scala> trim((" a ", "b ", " c")) 
res0: (String, String, String) = (a,b,c) 

scala> trim((" a ", "b ", " c", "d")) 
res1: (String, String, String, String) = (a,b,c,d) 

सब कुछ उचित रूप से स्थिर टाइप किया है, और अगर आप इसे किसी भी गैर String तत्वों के साथ एक टपल को खिलाने के लिए प्रयास करने पर आपको संकलन में एक त्रुटि मिल जाएगा टिम ई।

शैपलेस जैसी लाइब्रेरी के बिना - जो आपके लिए सभी बॉयलरप्लेट को प्रभावी ढंग से पैकेज करता है-आप दो विकल्पों के साथ फंस गए हैं: टाइप सुरक्षा को छोड़ दें, या हर ट्यूपल आकार के लिए एक विशेष केस लिखें (अधिकतम तक 22 का)।

+0

यह बहुत ही निहित तर्क है । – pedrofurla

+2

@pedrofurla: हाँ। यह संकलन-समय सबूत भी है कि आपके प्रकार सही हैं। –

+0

इस फ़ंक्शन के रनटाइम प्रदर्शन विशेषता क्या होगी? मुझे इसे मानचित्र के अंदर उपयोग करने की ज़रूरत है ताकि बहुत बड़े डेटासेट पर नौकरी कम हो। –

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