2011-09-15 11 views
10

me gustaría aplanar anidadas colecciones/estructuras arbitrarias de elementos de algún tipo T en Java, de forma óptima concon seguridad de tipos de colecciones/estructuras anidadas en Java

  • sólo tener una vista en vivo y no una colección copiada;
  • no solo manejando colecciones, sino también iterador, matrices de T de dimensión arbitraria, Iterable, y todas estas estructuras arbitrariamente mezcladas y anidadas;
  • statical type-safety.

¿Hay una biblioteca de Java que pueda manejar esto?


Guava parece sólo para manejar un nivel de anidamiento, es decir Collection<Collection<T>> --flatten ->Collection<T>.

lambdaj parece prometedor: ¿hay algún modo combinar on(), flattenIterator()asIterator() y para lograr esto? De una manera estática tipo seguro?

+3

No se basa en ninguna de las anteriores, pero tal vez una clase 'DeepIterator' que se construye con una' Colección' cuyo método 'next()' mira el siguiente 'Object' y si es' instanceof Collection' then empuja el 'iterator' actual en' Stack' y recurre en el iterador de 'Collection'. –

+0

Sí, he implementado algunos iteradores de esa manera. Sin embargo, tener que hacer una distinción de caso para matrices de dimensiones arbitrarias e iteradores es bastante complicado. Y no hay seguridad de tipo estático :(Dado que lambdaj probablemente lo implementa al menos tan bien, no creo que deba hacer esa implementación ... – DaveFar

+2

¿Qué quiere decir seguridad de tipo estático aquí? Desde la Colección (ADG en realidad) puede contener elementos de diferentes tipos, el iterador solo puede proporcionar 'Objetos'. ¿Me falta algo? –

Respuesta

0

Creo que esto puede ayudar a: Arrays.deepToString(myCollection.toArray())

+0

Para recuperar cadenas, sí. Para recuperar elementos del tipo T, lamentablemente esto no ayuda. – DaveFar

+0

@daveball, creo que todavía funcionaría, desea comprobar el código de deepToString y también depende de si el tipo T ha implementado toString –

+0

toString() ya se exporta en Object ... – DaveFar

1

No se basa en cualquiera de los anteriores, pero tal vez una clase DeepIterator que se construye con una colección cuyo método() al lado se ve en el siguiente objeto y si se trata de un instanceof La colección luego empuja el iterador actual en la pila y recursivamente en el iterador de esa colección.

+0

Tengo un deja-vu leyendo su publicación;) Pero es una buena idea darlo como una respuesta real: veamos sus votos ... – DaveFar

+0

@DaveBall Si se me puede votar negativamente por una respuesta correcta, tal vez pueda votar una respuesta parcial :) –

Cuestiones relacionadas