2012-10-08 51 views
1

我有一個來自Lucene.net的鍵值文檔列表,我希望能夠根據各種值根據用戶輸入對它們進行分組。所以基本上我有以下列表在.net中代表多個級別分組的體系結構

Doc#1 - Weight:10;Size:20;ExpiresIn:90days 
Doc#2 - Weight:10;Size:30;ExpiresIn:90days 
Doc#3 - Weight:10;Size:20;ExpiresIn:30days 
Doc#4 - Weight:10;Size:20;ExpiresIn:30days 

,我想用戶告訴我:組此大小則重量,這會產生以下

Size: 20 
Weight: 10 
    Count: 3 
    Doc#1, Doc#3, Doc#4 
Size: 30 
Weight: 10 
    Count: 1 
    Doc#2 

但他也告訴我要組在ExpiresIn:

ExpiresIn: 90Days 
Count: 2 
Doc#1, Doc#2 
ExpiresIn: 30Days 
Count: 2 
Doc#3, Doc#4 

我的問題是不是真正的速度(當然這肯定會存在巨大的數據集的情況下),但結構相當之一。我想知道我可以代表不同的實體,我有:

  • 包含文檔的列表中的葉類節點(和它們的計數,平凡)(在第一個例子的葉節點)
  • 包含葉片的列表(重量在第一示例)一個恰在上面的葉子節點
  • 包含節點的列表(大小在第1例的頂至n-2個節點

我試過從一個普通的抽象節點開始,它將包含一個通用節點的列表:然而,當我嘗試從頂端注入一個文檔時,這種方法會崩潰,因爲每個節點都不知道它自己的上下文,並沒有知道在他之後應該創造什麼。

Public MustInherit Class Node(Of T) 
    Implements IEnumerable(Of T) 

    Private InnerValue As String 
    Private InnerGrouping As String 
    Protected InnerData As New List(Of T) 

    MustOverride Sub AddGroupingElement(element As LuceneSearchResultsInfo) 
End Class 

Public Class LeafNode 
    Inherits Node(Of LuceneSearchResultsInfo) 

    Public Overrides Sub AddGroupingElement(element As LuceneSearchResultsInfo) 
     InnerData.Add(element) 
    End Sub 
End Class 

Public Class CommonNode 
    Inherits Node(Of CommonNode) 

    Public Overrides Sub AddGroupingElement(element As LuceneSearchResultsInfo) 
     Dim InterestedNode = InnerData.FirstOrDefault(Function(n) n.Value = element.Field(Grouping)) 
     If (InterestedNode Is Nothing) Then 
      InterestedNode = New CommonNode ' argh, i'm stuck, i don't know the rest of the context 
     End If 

    End Sub 
End Class 

我正在考慮存儲一個簡單的字典,以存儲爲關鍵字的文檔的完整路徑。這很簡單,但並不像一個專門的結構那樣愉快。所以,任何想法歡迎:)

回答

1

節點不能在這樣的結構中的任意級別插入。 (你的樹是按屬性分組的文檔列表的表示,在任意級別插入意味着屬性一致性的喪失,就好像你向一個表格添加單個單元格,而不是代表具有完整屬性集合的文檔的行)。 ,項目的插入和刪除應該由樹本身來維護。

考慮這樣的類結構(C#,因爲我不是VB語法好):

class TableAsTree 
{ 
    GroupingNode Root; 

    public void Insert(LuceneSearchResultsInfo sr) 
    { 
     /* Recursively insert */ 
     InsertToGroup(Root, sr); /* - root node would store all items */ 

    } 

    public void InsertToGroup(GroupingNode node, LuceneSearchResultsInfo sr) 
    { 
     node.Documents.Add(sr.Document); 
     //sample: Find "Weight" group with key = weight of current doc. 
     var childGroup = ChildGroups.First(g => g.GroupKey == sr.Fields(g.GroupFieldName)); /*create if there is no group for the value*/ 
     InsertToGroup(childGroup, sr); 
    } 
} 

class GroupingNode<TDocument> 
{ 
    string GroupKey;     /* Group key value = 1 or 2 or 3 in (Size=1,2,3), no meaning for root */ 
    string GroupFieldName;    /* Group field name (Size), null for root */ 
    List<TDocument> Documents;   /* Documents at the level - you can add them for each level, or of the level before the last one */ 
    List<GroupingNode> ChildGroups; 
} 

使用它,你就可以在每個分組級別的獲取文檔的列表。

+0

讓問題稍微成熟之後,我發現我所問的並不是我用樹表示的東西;然而,如果我們想要在各個層面獲得相同的功能,mikalai會帶來一個很好的解決方案。 – samy

相關問題