2011-08-18 9 views
9

Tengo lo que creo que es un problema interesante.¿Hay una estructura de árbol o algoritmo para barajar los niveles en un árbol?

Básicamente, tengo una lista de elementos, donde cada elemento tiene un conjunto fijo de metadatos, de diferentes valores.

Por ejemplo:

  • Punto 1: {type = "text", Autor = "Usuario A", Editado Fecha = "03/03/2003"}
  • Tema 2: Tipo = { "Tabla", autor = "Usuario A", fecha editada = "04/05/2006"}
  • Elemento 3: {Tipo = "Imagen", Autor = "Usuario B", fecha editada = "05/05/2005" }
  • Tema 4: {type = "text", Autor = "usuario B", Editado Fecha = "05/07/2007"}

Ahora, tal como está, esa lista de elementos se aplana y se presenta en una tabla.

Sin embargo, nos gustaría encontrar una forma de permitir que los usuarios lo naveguen en un árbol, pero con la flexibilidad añadida de que pueden 'pivotar' el orden en que cada una de las etiquetas de metadatos aparece en el árbol.

Así, en un principio puede parecer que:

Items 
+ Table 
    + User A 
    + 04/05/2006 
     -> Item 2 
    -> Item 2 
    -> Item 2 
+ Text 
    + User A 
    + 03/03/2003 
     -> Item 1 
    -> Item 1 
    + User B 
    + 05/07/2007 
     -> Item 4 
    -> Item 4 
    -> Item 1 
    -> Item 4 
+ Image 
    .. 

Sin embargo, supongamos que en su lugar, un usuario quiere darle la vuelta y ver todos los elementos relacionados con un usuario en particular:

Items 
+ User A 
    + Text 
    + Table 
    -> Item 1 
    -> Item 2 
+ User B 
    + Image 
    + Text 
    -> Item 3 
    -> Item 4 

Y así en.

Espero que tenga sentido.

Entonces, lo que me pregunto por lo tanto, es si hay un enfoque de mejores prácticas para lograr esto a bajo costo? El resultado de cada 'flip/shuffle/pivot' está muy bien representado en un árbol, por lo que obviamente el primer pensamiento es que cuando un usuario solicita cambiar la representación, se puede generar un nuevo árbol de la lista de elementos según sea necesario. Sin embargo, esperaba que tal vez haya una mejor manera, simplemente rotando un solo árbol, etc.

También, esto es algo que se puede hacer de manera computacionalmente barata en JavaScript en el navegador del usuario, si el backend simplemente se devuelve una lista plana de elementos?

Muchas gracias & saludos cordiales,

Jamie

+1

¿Esto está en Java o Javascript? Son dos idiomas muy diferentes. –

+0

@Reverend Gonzo - Preferentemente en JavaScript para permitir que el navegador del cliente modifique la presentación de los datos sin tener que repetir las solicitudes a un servlet. Sin embargo, si fuera demasiado intenso en JS, podría manejarse en Java cada vez. – Jay

+0

conozco a alguien que ha implementado esto como una forma de ver grandes conjuntos de datos en dispositivos móviles (si lo entiendo correctamente). Creo que es una especie de lib de JavaScript. ha presentado dos veces en nuestro grupo local de idiomas dinámicos. si está interesado, envíeme un correo electrónico a [email protected] y probablemente pueda conectarlo. –

Respuesta

0

La forma en que irían alrededor de resolver esto es definir un elemento de lista que lookgs algo como esto:

public class Item 
{ 
    string NodeName {get; set;} 
    string Url {get; set;} 
    List<Item> Children {get; set;} 
} 

Ésta es C# -code, pero la idea debería ser aplicable en cualquier idioma que admita objetos. Ahora su lista solo necesita soportar un tipo de lista, y esa es una lista de Item, así que todo lo que necesita hacer es encontrar una forma de transformar sus datos a dicha lista.

1

Desea presentar los elementos en una estructura de árbol, pero con una profundidad de árbol variable y el cambio de ramificación de árbol: dudo que una estructura de árbol sea realmente lo que desea.

Creo que deberías considerar que el mundo es plano (como en tu mesa). Una base de datos javascript podría ayudar (hay http://taffydb.com/)

Aún considerando el mundo es plano, también se puede crear una función de firma que devuelve una cadena

separator="µ"; //TODO Find something better 
function signature() { 
    return item.Type + separator + item.Author + separator + item.EditedDate; 
} 


assert(item1.signature == "TextµUser Aµ03/03/2003") 

A continuación se almacenan los objetos en un diccionario sencillo de utilizar este firma como la clave.

Y luego, puede realizar una coincidencia de expresiones regulares en las teclas para obtener los objetos que desea. Primero, edite la función de firma para devolver "([^ separator] +)" si la propiedad del elemento correspondiente no está definida.

assert ({Type="Text"}.signature() == "Textµ[^µ]+µ[^µ]+") 

function find(filterItem) { 
    retval= = new generic.list(); 
    for (var k in dict.keys()) { 
    if (k.match(regexp)) { 
     retval.add(dcit[k]); 
    } 
    } 
} 

No tengo idea si esto es más rápido que explorar todos los elementos.

+0

Gracias por señalarme hacia el taffydb, no había oído hablar de las bases de datos del lado de JavaScript. Voy a pensar si aprovechar las 'consultas' cada vez más específicas en el taffydb funcionaría. Afortunadamente, la matriz json de objetos devueltos son matrices asociativas simples, con claves consistentes. Me pregunto cómo el rendimiento de taffydb se compararía con un enfoque de partición recursivo de la matriz en subarrays de forma dinámica a medida que el usuario decida qué tipo de metadatos se ramificará a continuación. – Jay

Cuestiones relacionadas