2013-06-04 2 views
9

में एक ही तत्वों द्वारा tuples विलय करने के लिए उदाहरण के लिए, अगर मैं निम्नलिखित tuples है:कैसे स्काला

(1, "a", "l") 
(1, "a", "m") 
(1, "a", "n") 

मैं उन्हें इस तरह मर्ज करना चाहते हैं:

(1, "a", List("l", "m", "n")) 

मेरे मामले में, सूचियों Slick का उपयोग कर एक आंतरिक शामिल होने का नतीजा है। तो, पहले और दूसरे तत्व (1 और "a") समान होना चाहिए। यदि कोई जानता है कि स्लिम का उपयोग करने के मामले में इस तरह विलय कैसे करें, तो कृपया मुझे बताएं।

या अधिक आम तौर पर, समान तत्वों द्वारा आंतरिक सूचियों के साथ tuples मर्ज करने का तरीका।

(1, "a", "l") 
(1, "a", "m") 
(1, "b", "n") 
(1, "b", "o") 
// to like this 
List((1, "a", List("l", "m")), (1, "b", List("n", "o"))) 
+0

यदि आपके पास कोई केस है (1, "ए", "एम") और (2, "ए", "एल") tuples के साथ आप क्या परिणाम उम्मीद करते हैं? – 4lex1v

+0

@ 0__ आपका अंग्रेजी वाक्यविन्यास संशोधित करने के लिए बहुत धन्यवाद। – Outsider

उत्तर

8

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

val l = ??? // Your list 

val groups = l groupBy { case (a, b, c) => (a,b) } 

val tups = groups map { case ((a,b), l) => (a,b,l.map(_._3)) } 

tups.toList 
+0

धन्यवाद @ gzm0 !! यही वही है जो मैं चाहता हूं। – Outsider

1

आप की कोशिश कर सकते foldRight

val l = List((1, "a", "l"), (1, "a", "m"), (1, "a", "n"), (1, "b", "n"), (1, "b", "o")) 
val exp = List((1, "a", List("l", "m", "n")), (1, "b", List("n", "o"))) 

val result = l.foldRight(List.empty[(Int, String, List[String])]) { 
    (x, acc) => 
    val (n, s1, s2) = x 

    acc match { 
     case (n_, s1_, l_) :: t if (n == n_ && s1 == s1_) => 
     (n_, s1_, (s2 :: l_)) :: t 

     case _ => 
     (n, s1, List(s2)) :: acc 

    } 
} 

println(result) 
println(result == exp) 

अद्यतन

इनपुट सूची पृथक नहीं किया जा रहा है, तो:

val result = l.sorted.foldRight(...) 
+0

यह केवल काम करेगा सभी उपरोक्त उदाहरणों की तरह क्रमबद्ध हैं। अगर चार tuples अलग तरीके से व्यवस्थित किया गया था, तो यह समाधान – Jatin

+0

से मेल नहीं खाता डेटा डेटाबेस से आता है, इसलिए इसे डेटाबेस द्वारा क्रमबद्ध किया जाना चाहिए। वैसे भी, बस मामले में, मैंने एक अद्यतन जोड़ा है। – Beryllium

+0

मैंने आपके कोड से सीखा। लेकिन gzm0 का जवाब आमतौर पर मुझे लगता है। बीटीडब्ल्यू @ बेरीलियम धन्यवाद। – Outsider