请有人帮忙!!我是Java的新手。我想从数组列表中创建一个树结构。我的意见是
1.1
1.2
1.3
1.3.1.1
1.3.1.2
1.4
1.4.1.1
1.4.2.1
我的目标是获得一棵树
1.1
1.2
1.3
1.4 1.3.1.1
1.4.1.1 1.5 1.3.1.2
1.4.1.2
等等。
请在下面找到我的课程。我在test.tree.Node.addChild(Node.java:28)得到一个nullPoniter,我知道这是因为'children'是null但我不知道如何第一次设置子项。请帮助...... :(
public class Tree {
private Node root;
public Tree(String rootData)
{
root=new Node();
root.data=rootData;
root.children=new ArrayList<Node>();
}
public Tree() {
super();
}
public Node getRoot(){
return this.root;
}
public void setRoot(Node rootElement) {
this.root = rootElement;
}
}
和Node类
class Node {
String data;
Node parent;
List<Node> children;
public Node() {
super();
}
public Node(String name)
{
super();
this.data=name;
}
public void addChild(String name) {
this.addChild(new Node(name));
}
public void addChild(Node child) {
this.children.add(child);
}
public void removeChild(Node child) {
this.children.remove(child);
}
public void removeChild(String name) {
this.removeChild(this.getChild(name));
}
public Node getChild(int childIndex) {
return this.children.get(childIndex);
}
public Node getChild(String childName) {
for (Node child : this.children) {
if (child.data.equals(childName)) { return child; }
}
return null;
}
public List<Node> getChildren() {
if (this.children == null) {
return new ArrayList<Node>();
}
return this.children;
}
public void setChildren(List<Node> children) {
this.children = children;
}
public Node getParentNode() {
return this.parent;
}
}
,Test类是
public class TreeTest {
public static void main(String[] args) {
TreeTest tt = new TreeTest();
ArrayList<String> newArr= new ArrayList<String>();
newArr.add("1.1");
newArr.add("1.2");
newArr.add("1.3");
newArr.add("1.3.1.1");
newArr.add("1.3.1.2");
newArr.add("1.4");
newArr.add("1.4.1.1");
newArr.add("1.4.2.1");
int lCount=0;
int maxCount= newArr.size();
Tree tr= new Tree();
Node rootNode = new Node();
String parent_name=null;
Node currentNode= new Node();
for(String line: newArr){
if(lCount==0){
rootNode = tt.getTree(line);
tr.setRoot(rootNode);
currentNode= rootNode;
}
else{
List<Integer> cur = new ArrayList<Integer>();
List<Integer> pre = new ArrayList<Integer>();
cur= tokenize(line);
pre= tokenize(newArr.get(lCount-1));
if(cur.size()==pre.size()){
currentNode.addChild(tt.getTree(line));
currentNode= tt.getTree(line);
}
else if (cur.size()>pre.size()){
currentNode.addChild(tt.getTree(line));
parent_name= newArr.get(lCount-1);
currentNode= tt.getTree(line);
}
else if(cur.size()< pre.size()){
currentNode= tt.getTree(parent_name);
currentNode.addChild(tt.getTree(line));
currentNode= tt.getTree(line);
}
}
lCount++;
}
}
private Node getTree(String string) {
// TODO Auto-generated method stub
Node rootNode = new Node(string);
return rootNode;
}
private static List<Integer> tokenize(String line) {
// TODO Auto-generated method stub
List<Integer> line_Arr = new ArrayList<Integer>();
String[] tokens = line.split("\\.");
int i=0;
for(String atr: tokens)
line_Arr.add(Integer.parseInt(atr));
return line_Arr;
}
}
答案 0 :(得分:1)
在Node
类的两个构造函数中,在super
调用后添加此语句: -
children = new ArrayList<Node>();
这将实例化您的List children
。
public Node() {
super();
this.children = new ArrayList<Node>();
}
public Node(String name)
{
super();
this.children = new ArrayList<Node>();
this.data=name;
}
此外,您可以从: -
更改1-arg and 0-arg
Tree
构造函数
public Tree(String rootData)
{
root=new Node();
root.data=rootData;
root.children=new ArrayList<Node>();
}
public Tree() {
super();
}
到下面的那个,将使用参数化构造函数实例化Node
: -
public Tree(String rootData) {
root=new Node(rootData);
}
public Tree() {
root = new Node();
}
P.S:
如果您只想调用超类super()
构造函数,则无需显式添加0-arg
调用。编译器默认添加此调用。