2011-09-15 75 views
10

我想壓扁任意深度嵌套的集合/結構一些Java中的T類型的元素,最佳地類型安全的扁平化

  • 只具有實時取景和不是複製的集合;
  • 不僅可以處理集合,還可以處理Iterator,任意維度T,Iterable等數組以及任意混合嵌套的所有這些結構;
  • 靜態類型安全。

是否有一個Java庫可以處理這個問題?


Guava似乎只能處理一個嵌套層次,即Collection<Collection<T>> --flatten - >Collection<T>

lambdaj看起來很有前途:我能以某種方式結合on()asIterator()flattenIterator()來達到這個目的嗎?以靜態類型安全的方式?

+3

不基於上述兩者之一,但可能是一個'DeepIterator'類,它由'Collection'構造,其'next'方法查看下一個'Object',如果它是'instanceof Collection',則在Stack上推送當前的'iterator'並遞歸到'Collection'的迭代器中。 –

+0

是的,我已經實現了一些迭代器。儘管如此,必須爲任意維和迭代器的數組做個案區分非常麻煩。而且沒有靜態類型安全:(因爲lambdaj可能實現它至少一樣好,我不認爲我應該這樣做... – DaveFar

+2

這裏指什麼靜態類型安全?由於集合(實際上是ADG)可以包含不同類型的元素,Iterator只能提供'Object's,我是否缺少一些東西? –

回答

0

我想這可能幫助:Arrays.deepToString(myCollection.toArray())

+0

對於檢索字符串,是的。對於檢索類型T的元素,這不幸沒有幫助。 – DaveFar

+0

@daveball我認爲它仍然有效,你想檢查deepToString的代碼,也取決於類型T是否實現了toString –

+0

toString()已經在Object ... – DaveFar

1

不是基於上述任何一種的,但也許這就是構建一個集合,其next()方法着眼於下一個對象和DeepIterator類,如果它是一個的instanceof然後集合在Stack上推送當前迭代器並遞歸到該集合的迭代器中。

+0

我有閱讀你的文章的deja-vu;)但是把它作爲一個真正的答案是個好主意 - 讓我們看看它的投票... – DaveFar

+0

@DaveBall如果我可以downvoted一個正確的答案,也許我可以upvoted爲部分答案:) –