我有一个以下列方式保存树结构的csv:
Root;;;;;;;
;Cat1;;;;;;
;;Sub1;;;;;
;;Sub2;;;;;
;;Sub3;;;;;
;Cat2;;;;;;
;;Sub4;;;;;
;;;SSb1;;;;
我想在JAVA中加载此结构并将其显示在JTree中。
我使用opencsv来解析strcuture并动态创建一个Tree。这就是它的样子:
public static DefaultMutableTreeNode root = null;
public static DefaultMutableTreeNode pointer = null;
public static DefaultMutableTreeNode temp = null;
public static int index = 0;
public static void main(String[] args) {
CSV csv = CSV
.separator(';') // delimiter of fields
.quote('"') // quote character
.create(); // new instance is immutable
csv.read("MyCSV.csv", new CSVReadProc() {
public void procRow(int rowIndex, String... values) {
if (root == null) {
root = new DefaultMutableTreeNode(values[0]);
pointer = root;
index = 1;
} else {
for(int i = 0; i<values.length;i++) {
if (!values[i].isEmpty() && (i+1)<values.length) {
if (index == i) {
} else if (index < i) {
pointer = temp;
index = i;
}
temp = new DefaultMutableTreeNode(values[i]);
pointer.add(temp);
}
}
}
}
});
}
当然这不起作用,因为指针的行为不正确(一个指针太少)。我认为一个解决方案是创建一个包含每层中所有“最后”父项的数组(例如,如果解析器位于Sub4,则数组将是[root,Cat2]。) 这个问题有更聪明的解决方案吗?
(静态定义仅用于快速测试原因)
答案 0 :(得分:1)
您可以使用Map<Integer, TreeNode>
密钥是对象的深层索引,TreeNode将是该索引的最后一个。
然后,您可以将index-1
作为父母。
Root;;;;;;; --> [{1,Root}] i=1
;Cat1;;;;;; --> [{1,Root},{2,Cat1}] --> i=2 --> Parent : Root
;;Sub1;;;;; --> [{1,Root},{2,Cat1},{3,Sub1}] --> i=3 --> Parent : Cat1
;;Sub2;;;;; --> [{1,Root},{2,Cat1},{3,Sub2}] --> i=3 --> Parent : Cat1
;;Sub3;;;;; --> [{1,Root},{2,Cat1},{3,Sub3}] --> i=3 --> Parent : Cat1
;Cat2;;;;;; --> [{1,Root},{2,Cat2},{3,Sub2}] --> i=2 --> Parent : Root
;;Sub4;;;;; --> [{1,Root},{2,Cat2},{3,Sub4}] --> i=3 --> Parent : Cat2
;;;SSb1;;;; --> [{1,Root},{2,Cat2},{3,Sub4},{4,SSb1}] --> i=4 --> Parent : Sub4