2013-04-22 68 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