2011-07-27 83 views
0

說我有兩個列表任意大小的元組與第一元素類型固定

val L1 = List[(Int, Int)]((1,1), (2,2)) 
val L2 = List[(Int, Int, Int)]((1,1,1), (2,2,2)) 

現在我想打一個功能func,它接受一個int值i和兩份名單的所有項目,其中第一元素相匹配i 。一種方法是

def func(i:Int) = { 
    L1.collect.collect{case any if any._1 != i => any} 
    L2.collect.collect{case any if any._1 != i => any} 
} 

考慮到這兩條線是如此相似,如果可以縮短代碼會很好。我在某種程度上可以將L1(和L2)作爲參數傳遞給func。該函數不應該事先知道元組將具有多少元素,只是第一個元素是Int

這可能嗎?

[編輯:我覺得這個問題還不夠清楚。我的歉意。]

這是我想要做的。我想通過多次呼叫func多個列表,在兩個以上的列表中執行此操作,例如n。

L1 = L1.collect.collect{case any if any._1 != i => any} 
    L2 = L2.collect.collect{case any if any._1 != i => any} 
    ... 
    Ln = Ln.collect.collect{case any if any._1 != i => any} 

其中每個L1L2,... Ln是元組的列表與第一元件Int

[EDIT2]

在上文中,L1可能是列表的(Int, String)L2可能是(Int, Int, Int)等。唯一的保證是第一個元素是Int

回答

6
def func(i:Int, lst: List[Product]) = { 
    lst.filter(_.productElement(0) == i) 
    } 

市價修改您的編輯以上&丹的評論。

+0

謝謝。我不知道或'productIterator'。似乎解決了我的問題。該列表僅僅是爲了舉例說明如何處理元組(因爲缺少更好的元組)。我真的需要弄清楚如何以通用的方式處理元組。 – Jus12

+0

我不認爲我想要做什麼是可能的,但這似乎是處理元組的通用方法。我想要的是重新分配L1,L2等 – Jus12

+0

@ Jus12你可以將你的列表定義爲'var's而不是'val's,然後使用'L1 = func(i,L1)'等,如果這就是你想 –

2

任何Tuple(或者更確切地說,無論如何類)是Product,這樣你就可以使用該產品迭代的方法來處理不確定的大小的元組:

val x = (1,1,1,1) 
x.productIterator forall {_ == 1} //returns true 

的產品是爲了一個共同的超類型兩份名單的元素,你可以簡單地將它們串聯和過濾:

val list1 = List((1,1), (2,2)) 
val list2 = List((1,1,1), (2,2,2)) 

(list1 ::: list2) filter {_.productIterator forall {_ == 1}} 
//returns List[Product with Serializable] = List((1,1), (1,1,1)) 

UPDATE

包含產品的第一個元素過濾只是一個單一的列表:

val list1 = List((1,1), (2,2)) 
list1 filter {_.productIterator.next() == 1} 
+1

這將返回所有元組元素等於'i'的列表,我想OP希望元組中的第一項是'i'的元組,並且其他元素可以是任何東西,在這種情況下您可以使用Product。 productElement(0)獲取任何元組的第一個項目。 –

+0

我想我可以做'x.productIterator.next == 1'爲每個元組 – Jus12