我有一个 csv,它通过以下方式保存树结构:
Root;;;;;;;
;Cat1;;;;;;
;;Sub1;;;;;
;;Sub2;;;;;
;;Sub3;;;;;
;Cat2;;;;;;
;;Sub4;;;;;
;;;SSb1;;;;
我想在 JAVA 中加载此结构并将其显示在 JTree 中。
我使用 opencsv 来解析结构并动态创建一棵树。它看起来像这样:
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]。)有没有更聪明的解决方案来解决这个问题?
(静态定义只是为了快速测试的原因)
您可以使用Map<Integer, TreeNode>
键是对象的深层索引,TreeNode 将是该索引的最后一个。然后你就可以拿index-1
作为 parent 。
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
我是一名优秀的程序员,十分优秀!