2011-08-18 19 views
9

私は興味深い問題だと思っています。ツリーのレベルをシャッフルするツリー構造やアルゴリズムはありますか?

基本的には、各アイテムに異なる値の固定メタデータセットがあるアイテムのリストがあります。例えば

  • 項目1:{タイプ= "テキスト"、作成者= "ユーザA"、編集日= "2003年3月3日"}
  • アイテム2:{タイプ= {Type = "Image"、作成者= "User B"、編集日= "05/05/06"} "テーブル"、著者= "ユーザA"、編集日= "2006年4月5日"}
  • アイテム3: 2005" }
  • 項目4:{タイプ= "テキスト"、作成者= "ユーザB"、編集日= "05/07/2007"}

今のところ、その項目のリストは平らにされ、テーブルに表示されます。

しかし、ユーザがツリー内でそれをブラウズできるようにするには、ツリー内に各メタデータタグが表示される順序を「ピボット」できる柔軟性を追加したいと考えています。だから、

、最初はそれは次のようになります。その代わり、ユーザーはラウンドそれを反転して、特定のユーザーに関連するすべての項目を表示したいと仮定し、しかし

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

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

そしてそうに。

私はそれが理にかなっていると思います。

したがって、これを低コストで実現するためのベストプラクティスのアプローチがあるかどうかは疑問です。それぞれの「フリップ/シャッフル/ピボット」の結果はツリー内にうまく表現されているため、ユーザーが表示を変更するよう要求したときに、必要に応じてアイテムのリストを新しいツリーに作成できることは明らかです。しかし、おそらく単一のツリーを回転させるなど、より良い方法があると期待していました。

また、バックエンドが単に戻ってくるならば、ユーザーのブラウザ上でJavaScriptで計算上安く行うことができますアイテムのフラットリスト?

感謝&種類について、

ジェイミー

+1

これはJavaまたはJavaScriptでですか?彼らは2つの非常に異なる言語です。 –

+0

@Reverend Gonzo - JavaScriptでは、サーブレットへの繰り返し要求をせずにクライアントブラウザがデータの表示を変更できるようにすることをお勧めします。しかし、JSで行うのがあまりにも集中すると、毎回Javaで処理することができます。 – Jay

+0

モバイルデバイス上で大規模なデータセットを表示する方法としてこれを実装している人は知っています(正しく理解していれば)。私はそれがjavascriptのlibの一種だと思う。彼は現地の動的言語グループで2回プレゼンテーションをしました。あなたが興味を持っているのであれば、[email protected]で私に電子メールを送ってください。おそらくあなたを接続することができます。 –

答えて

0

は、彼らは道私がこのような何かをlookgsリスト項目を定義することで解決するために周りに行くだろう:

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

これは、C#で-codeを使用しますが、そのアイデアはオブジェクトをサポートするどの言語でも適用可能です。あなたのリストは1種類のリストのみをサポートする必要があり、それはItemのリストなので、データをそのようなリストに変換する方法を見つけるだけです。

1

要素をツリー構造で表示する必要がありますが、可変ツリー深度とツリー分岐の変更があります。ツリー構造が実際にあなたが望むものであるかどうかは疑問です。

私はあなたの世界がフラットである(テーブルのような)代わりに考えるべきだと思います。 JavaScriptのデータベースには、(http://taffydb.com/あり)助けることができる

それでも世界はフラットで検討

、あなたはまた、あなたがこれを使用して、簡単な辞書にあなたのオブジェクトを格納

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

次に文字列を返す署名機能を作成することができます署名をキーとして使用します。

そして、キーで正規表現マッチを実行して、必要なオブジェクトを取得することができます。 まず、対応するアイテムプロパティが定義されていない場合、 "([^ separator] +)"を返すシグネチャ関数を編集します。

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

私は、これはしかし、すべての要素を閲覧するよりも高速であるかどうかはわかりません。

+0

私はtaffydbに向かって私を指してくれてありがとう、私はJavaScriptのサイドデータベースを聞いていないだろう。 私は、taffydb上でますます特定の「クエリ」を利用することが効果的かどうかを考えようとしています。ありがたいことに、返されるオブジェクトのjson配列は、一貫したキーを持つ単純な連想配列です。 taffydbのパフォーマンスは、ユーザが次にどのタイプのメタデータを分岐するかを決定する際に、アレイのサブアレイへの再帰的な分割アプローチとどのように比肩しているのだろうかと思います。 – Jay