2013-02-20 66 views
7

टपल करने के लिए मैं खाली स्थान के 4 तत्वों है कि पर एक स्ट्रिंग विभाजित करने के लिए करना चाहते हैं:स्काला स्ट्रिंग विभाजित

1 1 4.57 0.83 

और मैं सूची [(स्ट्रिंग, स्ट्रिंग, प्वाइंट)] इस तरह के में तब्दील करने की कोशिश कर रहा हूँ कि पहले दो विभाजन सूची में पहले दो तत्व हैं और अंतिम दो बिंदु है। मैं निम्नलिखित कर रहा हूँ, लेकिन यह काम करने के लिए प्रतीत नहीं होता:

Source.fromFile(filename).getLines.map(string => { 
      val split = string.split(" ") 
      (split(0), split(1), split(2)) 
     }).map{t => List(t._1, t._2, t._3)}.toIterator 
+1

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

+0

मैं सहमत हूं, यह –

उत्तर

8

आप जो सरणी से की जरूरत को निकालने के लिए मिलान पैटर्न इस्तेमाल कर सकते हैं:

case class Point(pts: Seq[Double]) 
    val lines = List("1 1 4.34 2.34") 

    val coords = lines.collect(_.split("\\s+") match { 
     case Array(s1, s2, points @ _*) => (s1, s2, Point(points.map(_.toDouble))) 
    }) 
+1

यह मेरे लिए संकलित नहीं करता है, मैंने एक और समान उत्तर जोड़ा जो संकलित करता है - मुझे टिप्पणियों में कोड को ठीक से दिखाने के लिए कोड नहीं मिल सका। मैं यह जानकर उत्सुक होगा कि अगर कोई और जानता है तो संग्रह कैसे इस्तेमाल किया जा सकता है। 'संग्रह' * के एपीआई से –

+0

* "इस सूची के सभी तत्वों को आंशिक फ़ंक्शन लागू करके एक नया संग्रह बनाता है जिस पर फ़ंक्शन परिभाषित किया गया है।" *। यह सिर्फ 'मानचित्र' जैसा है लेकिन आंशिक फ़ंक्शन –

1

आप एक Point में तीसरे और चौथे टोकन नहीं बदल पा रहे हैं और न ही आप एक List में लाइनों परिवर्तित कर रहे हैं। साथ ही, आप प्रत्येक तत्व को Tuple3 के रूप में प्रस्तुत नहीं कर रहे हैं, लेकिन List के रूप में।

निम्नलिखित जो कुछ आप ढूंढ रहे हैं उसके अनुरूप निम्नलिखित होना चाहिए।

case class Point(x: Double, y: Double) // Simple point class 
Source.fromFile(filename).getLines.map(line => { 
    val tokens = line.split("""\s+""") // Use a regex to avoid empty tokens 
    (tokens(0), tokens(1), Point(tokens(2).toDouble, tokens(3).toDouble)) 
}).toList // Convert from an Iterator to List 
+0

तत्वों के स्ट्रिंग को सूची() में परिवर्तित करने के करीब शीर्षक होना चाहिए PS: मैंने इसका परीक्षण नहीं किया। – cheeken

+0

माई प्वाइंट क्लास लेता है (इंडेक्सडैक [डबल]) तो मैं इंडेक्स सेक को टुपल से कैसे प्राप्त करूं? –

13

कैसे इस बारे में:

scala> case class Point(x: Double, y: Double) 
defined class Point 

scala> s43.split("\\s+") match { case Array(i, j, x, y) => (i.toInt, j.toInt, Point(x.toDouble, y.toDouble)) } 
res00: (Int, Int, Point) = (1,1,Point(4.57,0.83)) 
+0

के डोमेन में केवल तत्वों को छोड़ देता है सरल और स्पष्ट। आप इनपुट त्रुटियों को संभालने के लिए एक मामला जोड़ना चाहते हैं। –

-1

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

scala> (1,2,3).productIterator.toList 
res12: List[Any] = List(1, 2, 3) 

Bu टी आप देख सकते हैं के रूप में है कि वापसी प्रकार किसी भी और नहीं एक पूर्णांक

है विभिन्न प्रकार में परिवर्तित करने के लिए आप पैटर्न में https://github.com/milessabin/shapeless

1
case class Point(pts: Seq[Double]) 
val lines = "1 1 4.34 2.34" 

val splitLines = lines.split("\\s+") match { 
    case Array(s1, s2, points @ _*) => (s1, s2, Point(points.map(_.toDouble))) 
} 

की और उत्सुक के लिए Hlist उपयोग करते हैं, @ मिलान पैटर्न के लिए एक चर को बांधता है, इसलिए points @ _* पैटर्न * _ और * _ के लिए परिवर्तनीय बिंदुओं को बाध्यकारी है, शेष सरणी से मेल खाता है, इसलिए अंक एक सेक [स्ट्रिंग] होने के समाप्त होते हैं।

+0

एचएम .. मुझे स्कैला मिल रहा है। मैच त्रुटि: [Ljava.lang.String; @ 7bfacd5d (वर्ग [Ljava.lang.String;) मैं क्या गलत करता हूँ? – Sergey

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

  • कोई संबंधित समस्या नहीं^_^