2011-07-27 41 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