【问题标题】:Type-safe flattening of nested collections/structures in JavaJava中嵌套集合/结构的类型安全展平
【发布时间】:2011-11-17 20:42:18
【问题描述】:

我想扁平化 Java 中某种类型 T 的任意深度嵌套的集合/结构,最好使用

  • 只有实时视图而不是复制的集合;
  • 不仅处理集合,还处理迭代器、任意维度的 T 数组、Iterable 以及所有这些任意混合和嵌套的结构;
  • 静态类型安全。

有没有可以处理这个的java库?


Guava 似乎只处理一个嵌套级别,即Collection<Collection<T>> --flatten--> Collection<T>

lambdaj 看起来很有希望:我能以某种方式结合on()asIterator()flattenIterator() 来实现这一目标吗?以静态类型安全的方式?

【问题讨论】:

  • 不是基于上述任何一个,但可能是一个 DeepIterator 类,该类由 Collection 构造,其 next() 方法查看下一个 Object,如果它是 @987654332 @ 然后将当前的 iterator 推送到 Stack 并递归到 Collection 的迭代器中。
  • 是的,我已经以这种方式实现了一些迭代器。不过,必须对任意维度的数组和迭代器进行区分是非常繁琐的。并且没有静态类型安全:(由于 lambdaj 可能至少实现它一样好,我认为我不应该这样做......
  • 这里的静态类型安全是什么意思?由于Collection(实际上是ADG)可以包含不同类型的元素,Iterator 只能提供Objects。我错过了什么吗?
  • 至少对于所有任意深度嵌套的集合,您可以在编译时检测到叶子都是 T 类型。由于 lambdaj 提供了许多感觉是动态类型的函数(例如,在每个项目上调用一个方法),但实际上仍然是静态类型的,我希望 lambdaj 可以在编译时处理更多的结构和检查。
  • DeepIterator 方法听起来很有希望,但我认为您无法实现通用和静态的类型安全解决方案。我看不出你怎么能用 Java 表达这样的实体。

标签: java generics collections type-safety lambdaj


【解决方案1】:

Guava 可能会支持这个最终

http://code.google.com/p/guava-libraries/issues/detail?id=174

(从下往上阅读可能最容易,因为在它的一生中,对它的思考已经改变了几次。)

【讨论】:

    【解决方案2】:

    不是基于上述任何一个,但可能是一个 DeepIterator 类,它由一个 Collection 构造,其 next() 方法查看下一个 Object,如果它是一个 instanceof Collection 然后将当前迭代器推入 Stack 并递归到那个集合的迭代器。

    【讨论】:

    • 我在阅读您的帖子时有一种似曾相识的感觉;)但最好将其作为真实答案给出 - 让我们看看它的投票...
    • @DaveBall 如果我可以为正确答案投反对票,也许我可以为部分答案投反对票:)
    【解决方案3】:

    我认为这可能会有所帮助:Arrays.deepToString(myCollection.toArray())

    【讨论】:

    • 对于检索字符串,是的。对于检索类型 T 的元素,这很遗憾没有帮助。
    • @daveball 我认为它仍然可以工作,你想检查 deepToString 的代码,还取决于类型 T 是否实现了 toString
    • deepToString() 也不处理数组。也就是说,如果其中一个元素是Array,它将调用toString,而不是Arrays.deepToString。奇怪但真实。
    • @DaveBall 我认为 Suraj 的意思是 getDeclaredMethods(),它会告诉你 Class 是否实现了 toString() 本身。但我不知道这有什么帮助。你对知道对象的字符串表示是什么不感兴趣,你想要一个遍历所有对象的迭代器
    猜你喜欢
    • 2012-08-23
    • 2020-04-15
    • 1970-01-01
    • 2014-05-24
    • 2019-08-11
    • 2019-01-21
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多