2011-08-18 4 views
9

Mam to, co myślę, że jest interesującym problemem.Czy istnieje struktura drzewa lub algorytm do pomieszania wokół poziomów w drzewie?

Zasadniczo mam listę przedmiotów, w których każda pozycja ma ustalony zestaw metadanych o różnych wartościach.

Na przykład:

  • Pozycja 1: {type = "text", autor = "Użytkownik A", wydane Date = "03.03.2003"}
  • Pozycja 2: {Type = "Tabela", Autor = "Użytkownik A", Data edycji = "04/05/2006"}
  • Pozycja 3: {Typ = "Obraz", Autor = "Użytkownik B", Data edycji = "05/05/2005" }
  • Punkt 4: {type = "text", autor = "Użytkownik B", wydane Date = "05/07/2007"}

Teraz, w obecnej postaci, ta lista elementów jest spłaszczona i przedstawiona w tabeli.

Chcielibyśmy jednak znaleźć sposób, aby umożliwić użytkownikom przeglądanie ich w drzewie, ale z dodatkową elastycznością, że mogą "przestawić" kolejność każdego tagu meta-danych pojawia się w drzewie.

Więc początkowo może wyglądać następująco:

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 
    .. 

Załóżmy jednak, że zamiast użytkownik chce przerzucić go wokół i zobaczyć wszystkie elementy związane z konkretnym użytkownikiem:

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

i tak na.

Mam nadzieję, że ma to sens.

Zastanawiam się więc, czy istnieje podejście oparte na najlepszych praktykach w celu osiągnięcia tego przy niskich kosztach? Wynik każdego "flip/shuffle/pivot" jest ładnie reprezentowany w drzewie, więc oczywiście pierwsza myśl jest taka, że ​​gdy użytkownik żąda zmiany reprezentacji, można wygenerować nowe drzewo z listy elementów, jeśli jest to wymagane. Miałem jednak nadzieję, że może być lepszy sposób, po prostu obracanie jednego drzewa itp.

Czy jest to coś, co można zrobić tanio obliczeniowo w JavaScript w przeglądarce użytkownika, jeśli backend miał po prostu wrócić płaska lista przedmiotów?

Dziękujemy & pozdrowienia rodzaju,

Jamie

+1

Czy jest to w języku Java lub Javascript? To dwa bardzo różne języki. –

+0

@Reverend Gonzo - Najlepiej w JavaScript, aby umożliwić przeglądarce klienta zmianę prezentacji danych bez konieczności powtarzania żądań do serwletu. Jeśli jednak byłoby to zbyt intensywne w JS, może być obsługiwane za każdym razem w Javie. – Jay

+0

Znam kogoś, kto zaimplementował to jako sposób wyświetlania dużych zbiorów danych na urządzeniach mobilnych (jeśli dobrze rozumiem). Myślę, że jest to pewnego rodzaju javascript lib. Dwukrotnie przedstawił go w naszej lokalnej grupie języków dynamicznych. jeśli jesteś zainteresowany e-mailem na adres [email protected] i prawdopodobnie mogę cię połączyć. –

Odpowiedz

0

one sposobem pójdę wokół, aby rozwiązać ten jest zdefiniowanie elementu listy, które lookgs coś takiego:

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

to jest C# -code, ale pomysł powinien być stosowany w dowolnym języku obsługującym obiekty. Teraz twoja lista musi obsługiwać tylko jeden typ listy, a to jest lista Item, więc wszystko, co musisz zrobić, to znaleźć sposób na przekształcenie danych na taką listę.

1

Chcesz przedstawić elementy w strukturze drzewa, ale ze zmienną głębią drzewa i zmieniając rozgałęzienia drzewa: wątpię, czy struktura drzewa jest rzeczywiście zgodna z oczekiwaniami.

Myślę, że powinieneś rozważyć zamiast tego, że świat jest płaski (jak w twoim stole). Javascript baza danych może pomóc (istnieje http://taffydb.com/)

wciąż rozważa świat jest płaski, można również utworzyć funkcję podpisu, która zwraca ciąg

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") 

Wtedy przechowywania obiektów w prosty słowniku za pomocą tego podpis jako klucz.

Następnie można wykonać dopasowanie regexp na klawiszach, aby uzyskać żądane obiekty. Najpierw edytuj funkcję podpisu, aby powrócić "([^ separator] +)", jeśli właściwa właściwość elementu jest niezdefiniowana.

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]); 
    } 
    } 
} 

Nie mam pojęcia, czy jest to szybsze niż przeglądanie wszystkich elementów.

+0

Dzięki za skierowanie mnie w stronę taffydb, nie słyszałem o bazach danych po stronie javascript. Zastanowię się, czy zadziała wykorzystanie coraz bardziej konkretnych "zapytań" na taffydb. Na szczęście tablica json zwróconych obiektów to proste tablice asocjacyjne ze spójnymi kluczami. Zastanawiam się, w jaki sposób wydajność taffydb będzie się dynamicznie porównywać z rekurencyjnym podejściem do partycjonowania tablicy w podparach, gdy użytkownik zdecyduje, który typ meta-danych oddzieli na następny. – Jay

Powiązane problemy