2011-08-29 68 views
1

我对编程超新颖,我想知道如何解决那里最基本的问题之一 - “FizzBu​​zz”。我在Groovy中这样做。如何从数组或列表中选择所有值?

我对如何构建代码有一个非常具体的想法,但我不能为我的生活弄清楚如何针对数组中的每个值进行测试。

我的意思是说,对于列表[1,2,3,4]中的每个值,我将如何检查每个值是否均匀?我知道我可以选择数组中的每个特定点,但那不是我想要的 - 我希望能够说出类似于“如果n%2 = 0,甚至标记它”。

这是一个非常基本的例子,但你可能会明白。任何帮助将不胜感激。

+3

http://rosettacode.org/wiki/FizzBu​​zz#Groovy –

回答

0

我会做这样的事情:

def list = [1, 2, 3, 4] 

def map = [:] 

list.each { 
    if (it % 2 == 0) 
     map.putAt(it, "even") 
    else 
     map.putAt(it, "odd") 
} 

println map 

这会打印:[1:奇,β2:偶,3奇,4:偶],你可以做任何你想做中的“如果其他人'语句,但我认为你所要求的是如何一次迭代一个成员的集合,'每个'闭包是实现这个目标的主要方式。

+0

这正是我一直在寻找!谢谢! – Ben

+2

欢迎您,请将其标记为答案谢谢 - 唐 – awfulHack

+0

inject()也可以用来代替每个() – Rhysyngsun

5

Groovy允许您用功能性方法解决这个问题。通过应用映射转换,您可以生成包含数字的对的列表以及它是偶数还是奇数。

所有常规列表都有一个名为collect的方法,用于在每个元素上映射闭包。返回值是一个列表,其中包含每个元素调用闭包的结果。例如:

[1, 2, 3, 4].collect { 
     [it, it % 2 ? 'odd' : 'even'] 
} 
===> [[1:odd], [2:even], [3:odd], [4:even]] 

这会产生一个配对列表(实际上是2个元素列表)。想让结果成为地图而不是列表是常见的,groovy有一个collect的专用版本,collectEntries就是为了这个。这里有一个返回地图替代:

[1, 2, 3, 4].collectEntries { 
    [it, it % 2 ? 'odd' : 'even'] 
} 
===> {1=odd, 2=even, 3=odd, 4=even} 
相关问题