我有可展開樹(在HTML頁):尋找更好結構爲樹狀數據
+ Category 1
- Category 2
+ Subcategory 1
- Subcategory 2
|- Foo
|- Bar
|- Link 42
其由結構表示(在後端定義):
class Demo {
static ImmutableList<Item> sample() {
return ImmutableList.of(
new Item("Category 1", ImmutableList.of(
new Item("Some link title", "resource_id_1"),
new Item("Another link title", "resource_id_2"))),
new Item("Category 2", ImmutableList.of(
new Item("Subategory 1", ImmutableList.of(
new Item("Another link title", "resource_id_3"))),
new Item("Subcategory 2", ImmutableList.of(
new Item("Foo", "resource_id_1"),
new Item("Bar", "resource_id_2"),
new Item("Link 42", "resource_id_42"))))));
}
}
與Item
定義如下:
public class Item {
private String readableName;
private String resourceId;
private ImmutableList<Item> children;
Item(String name, String resourceId) {
this.readableName = name;
this.resourceId = resourceId;
}
Item(String name, ImmutableList<Item> children) {
this.readableName = name;
this.children = children;
}
public String getReadableName() {
return readableName;
}
public String getResourceId() {
return resourceId;
}
public ImmutableList<Item> getChildren() {
return children;
}
}
resourceId
可以有不同的可讀的名稱,並且可以是PLA在整個結構中不止一次,但在當前類別/子類別中只有一次。
目前當用戶點擊一個鏈接或寫資源被加載(例如,鏈接富映射到/showResource?id=resource_id_1:uniqe_magic_id
)和樹木展開URL。它僅僅是因爲一個黑客 - 前端創建了自己的結構副本,並在每個資源ID(每個葉)上附加了一些:uniqe_magic_id
字符串,並且在發送請求到後端時,它會劃分魔術部分。 :uniqe_magic_id
僅被前端用於擴展上面顯示的樹中的正確項目。對我來說,這似乎是一個很好的解決方案(我重構了這段代碼,並刪除了cleanId
方法,我認爲這不是必須的,但是在發送請求到後端之前就已經剝離了魔法......),我正在尋找更好的方法。
我可以修改前端和後端。我想到了一些類似節點的樹:
class Node {
Node next;
Node child;
String readableName;
String resourceId;
String someUniqueHash;
}
和使用someUniqueHash
。
有沒有更好的方法來實現相同的結果,而不需要在前端複製整個結構?
我不認爲這會解決你的問題,但由於你需要在任何級別強制執行任何重複值,你有沒有想過使用LinkedHashSet(或不可變的)而不是List? –
'List'最初在這裏用來表示它以某種方式被排序,'Item's到目前爲止沒有hashCode/equals,但它是一個小的(而且有用的)建議,它並不能真正解決我的問題。 – Xaerxess
如何僅維護後端結構?在前端顯示樹並始終要求在服務器的點擊節點處開始一個子樹?另外,使用weakhashmap可能會有用。 –