2011-08-18 36 views
9

Tôi có những gì tôi nghĩ là một vấn đề thú vị.Có cấu trúc cây hoặc thuật toán để trộn các cấp trong cây không?

Về cơ bản, tôi có một danh sách các mục, trong đó mỗi mục có một bộ siêu dữ liệu cố định, có giá trị khác nhau.

Ví dụ:

  • khoản 1: {type = "text", tác giả = "User A", Chỉnh sửa ngày = "2003/03/03"}
  • khoản 2: {Type = "Bảng", Tác giả = "Người dùng A", Ngày chỉnh sửa = "04/05/2006"}
  • Mục 3: {Type = "Hình ảnh", Tác giả = "Người dùng B", Ngày chỉnh sửa = "05/05/2005 "}
  • Mục 4: {Loại =" Văn bản ", Tác giả =" Người dùng B ", Ngày chỉnh sửa =" 05/07/2007 "}

Bây giờ, khi nó đứng, danh sách các mặt hàng được san bằng và được trình bày trong một bảng. Tuy nhiên, chúng tôi muốn tìm cách cho phép người dùng duyệt qua cây trong một cây, nhưng với sự linh hoạt hơn, họ có thể 'xoay vòng' thứ tự mà mỗi thẻ siêu dữ liệu xuất hiện trên cây.

Vì vậy, ban đầu nó có thể trông giống như:

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

Tuy nhiên, giả sử thay vào đó, người dùng muốn lật nó tròn và xem tất cả các mục liên quan đến một người dùng cụ thể:

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

Và như vậy trên.

Tôi hy vọng điều đó có ý nghĩa.

Vì vậy, điều tôi đang tự hỏi, liệu có cách tiếp cận thực hành tốt nhất để đạt được điều này với chi phí thấp không? Kết quả của mỗi 'flip/shuffle/pivot' được biểu diễn độc đáo trên cây, vì vậy rõ ràng ý nghĩ đầu tiên là khi người dùng yêu cầu thay đổi biểu diễn, một cây mới có thể được tạo ra trong danh sách các mục theo yêu cầu. Tuy nhiên, tôi đã hy vọng có lẽ có một cách tốt hơn, chỉ cần xoay một cây duy nhất, vv ..

Ngoài ra, đây có thể được thực hiện bằng JavaScript rẻ trên trình duyệt của người dùng, nếu chương trình phụ trợ chỉ đơn giản trả lại một danh sách các mặt hàng phẳng?

Rất cám ơn & loại liên quan,

Jamie

+1

Đây có phải là trong Java hoặc Javascript không? Chúng là hai ngôn ngữ rất khác nhau. –

+0

@Reverend Gonzo - Tốt hơn trong JavaScript để cho phép trình duyệt của khách hàng thay đổi cách trình bày dữ liệu mà không cần phải thực hiện các yêu cầu lặp lại đối với một servlet. Tuy nhiên, nếu nó sẽ là quá chuyên sâu để làm trong JS, nó có thể được xử lý trong Java mỗi lần. – Jay

+0

tôi biết ai đó đã triển khai cách này để xem các tập dữ liệu lớn trên thiết bị di động (nếu tôi hiểu chính xác). tôi nghĩ rằng đó là một số loại javascript lib. anh ấy đã trình bày về nó hai lần ở nhóm ngôn ngữ năng động tại địa phương của chúng tôi. nếu bạn quan tâm gửi email cho tôi theo địa chỉ [email protected] và tôi có thể kết nối bạn. –

Trả lời

0

Họ cách tôi sẽ đi xung quanh để giải quyết việc này là để xác định một mục danh sách đó lookgs một cái gì đó như thế này:

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

Đây là C# -code, nhưng ý tưởng nên được áp dụng trong bất kỳ ngôn ngữ nào hỗ trợ các đối tượng. Bây giờ danh sách của bạn chỉ cần hỗ trợ một loại danh sách và đó là danh sách Item vì vậy tất cả những gì bạn cần làm là tìm cách chuyển đổi dữ liệu của bạn thành danh sách như vậy.

1

Bạn muốn trình bày các phần tử trong cấu trúc cây, nhưng với độ sâu cây biến đổi và thay đổi nhánh cây: Tôi nghi ngờ một cấu trúc cây là thực tế những gì bạn muốn.

Tôi nghĩ bạn nên cân nhắc thay vào đó thế giới bằng phẳng (như trong bảng của bạn). Một cơ sở dữ liệu javascript có thể giúp (có http://taffydb.com/)

Tuy nhiên xem xét thế giới là phẳng, bạn cũng có thể tạo một hàm chữ ký mà trả về một chuỗi

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

Sau đó bạn lưu trữ đối tượng của bạn trong một từ điển đơn giản sử dụng này chữ ký là chìa khóa.

Và sau đó, bạn có thể thực hiện đối sánh regexp trên các phím để nhận các đối tượng bạn muốn. Trước tiên, hãy chỉnh sửa hàm chữ ký để trả về "([^ dấu tách] +)" nếu thuộc tính mục tương ứng không được xác định.

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

Tôi không biết liệu điều này có nhanh hơn duyệt qua tất cả các yếu tố hay không.

+0

Cảm ơn bạn đã chỉ cho tôi về phía taffydb, tôi không nghe nói về cơ sở dữ liệu bên javascript. Tôi sẽ suy nghĩ xem liệu việc tận dụng các 'truy vấn' ngày càng cụ thể trên taffydb có hiệu quả hay không. Rất may, mảng json của các đối tượng được trả về là các mảng kết hợp đơn giản, với các khóa nhất quán. Tôi tự hỏi làm thế nào hiệu suất của taffydb sẽ so sánh với một cách tiếp cận phân vùng đệ quy của mảng thành mảng phụ động khi người dùng quyết định loại siêu dữ liệu nào sẽ phân nhánh tiếp theo. – Jay

Các vấn đề liên quan