2013-04-22 25 views
0

例如,是否可以在番石榴中创建一个偶数范围? 喜欢的东西:番石榴的连续范围

Range.closed(0,10) //0,2,4,6,8,10 

我明白,线上不会产生输出需要的,但这样的事情可能是:

Range.closed(0,10, SomeFunctionInterface<Integer>); 

其中

interface SomeFunctionInterface<T>{ 
     T computeNext(T first); 
} 

是否有可能在番石榴?这仍然是一个连续的范围,只是一定的规则适用于它。

我只对番石榴解决方案感兴趣。

+2

“这仍然是一个连续的范围,只是一个特定的规则适用于它。”不是真的,因为它是'Integer'的范围,0和2等不是连续的'Integer'对象。如果你要创建一个'EvenInteger'类型和一个'DiscreteDomain '(注意:不要那样做),我猜可能是这种类型的一个连续范围。 Guava的'Range'预计会有一种比较每种你想使用的Java类型的规范方法,'ContiguousSet'需要一个规范的'DiscreteDomain'。 – ColinD 2013-04-22 15:18:25

+0

@ColinD你让我重新考虑这一点,我认为这是绝对正确的。 – Eugene 2013-04-22 15:23:05

+2

从javadoc:'范围*凸:*只要包含两个值,它们之间的所有值也必须包含。更正式地说,对于类型为'C'的任何'c1 <= c2 <= c3','r.contains(c1)&& r.contains(c3)'意味着'r.contains(c2)'。这意味着'范围'永远不能用来表示,比如说“从1到100的所有素数。”' – 2013-04-22 16:39:19

回答

6

如果您将两项操作组合在一起,番石榴可以支持此操作。首先,创建集合{0,1,2,3,4,5,6,7,8,9,10}。然后,你过滤它。

要将Range变成中间未过滤的集合,请创建ContiguousSet。要做到这一点,你需要一个DiscreteDomain,这基本上就是你所描述的SomeFunctionInterface。既然你在处理整数,你可以使用内置的DiscreteDomain.integers()

要从那里到只有偶数的集合,您可以编写Predicate,然后传递它并将中间集合设置为Sets.filter

+1

FWIW,这会让你成为'Set',而不是'Range'。 – 2013-04-22 15:19:58

+1

(也是FWIW,它是故意设计的,所以你无法获得'范围',因为Colin上面讨论的原因。) – 2013-04-22 15:28:20

+0

真的,我把你的问题转换成我可以回答的东西:)出于好奇,你能够通过一个'集合?或者也许是通过用'isEven'谓词组成原来的'Range'(它本身实现'Predicate''')构造的'Predicate'?也许你希望有一个'Range'的系统部分可以被改变来与其中一个工作。 (如果没有,我们可以尝试给你一些其他建议,如果你想填写一些关于你的要求的更多细节。) – 2013-04-22 19:17:00