2011-12-09 49 views
0

我的XML看起來像:要創建一個可以嵌套對的鍵值也

<node key="asdfasdf">value</node> 

,但也可能是這樣的:時間

<node key="asdf"> 
    <node key="2234">asdfsdf</node> 
    <node key="223422"> qasdfljk</node> 
</node> 

99%,不存在套疊的鍵/值對,所以我應該如何創建一個keyvalue類? 我想我應該懶惰初始化內部集合?

我應該如何定義這個類,我應該繼承SimpleEntry嗎?

回答

1

您可以使用Guava Multimap,該集合代表您需要的東西。 http://code.google.com/p/guava-libraries/

例子:

public static void main(final String[] args) throws Exception { 

    final Multimap<String, Entry<String, String>> multimap = HashMultimap.create(); 
    multimap.put("asdfasdf", new NodeEntry(null, "value")); 
    multimap.put("asdf", new NodeEntry("2234", "asdfsdf")); 
    multimap.put("asdf", new NodeEntry("223422", "qasdfljk")); 

    System.out.println(multimap); 

} 

class NodeEntry implements Entry<String, String> { 

    private final String key; 
    private final String value; 

    public NodeEntry(final String key, final String value) { 
     this.key = key; 
     this.value = value; 
    } 

    @Override 
    public String getKey() { 
     return key; 
    } 

    @Override 
    public String getValue() { 
     return value; 
    } 

    @Override 
    public String setValue(final String value) { 
     throw new UnsupportedOperationException(); 
    } 

    @Override 
    public String toString() { 
     final StringBuilder builder = new StringBuilder(); 
     builder.append("NodeEntry [key=").append(key).append(", value=").append(value).append("]"); 
     return builder.toString(); 
    } 

} 
+0

你能幫助一些代碼嗎?這是一個令人困惑的結構:)我想要一個鍵/值對,值是一個列表。哦,當我寫這篇文章時,我好像看到了多圖的功能。 – Blankman

+0

等待,關鍵是一個字符串,並且該值是一個List ,那麼在java中該如何工作? (我是一個C#人) – Blankman

+0

我添加了一個例子。有一個使用自定義節點類的以前的答案。我會說,根據你的需要,你應該選擇其他的。例如:如果您要主要查找/搜索/等。 Map解決方案可能更易於使用。 –

3

我不知道這是不是一個好主意:

public class Node { 
    private String key; 
    private String value; 
    private List<Node> subNodes; 

    //you can check if the node has subnode(s) 
    private boolean hasSubNodes(){ 
     return !(subNodes == null || subNodes.isEmpty()); 
    } 

    // if there is nested node, cannot call getValue 
    private String getValue(){ 
     if (hasSubNodes()) 
      throw new RuntimeException("blahblah"); 
     else 
      return value; 
    } 

    //getters,setters are omitted 

} 

這樣你可以有很多的嵌套,只要你喜歡。