码迷,mamicode.com
首页 > 其他好文 > 详细

评价体系的树结构

时间:2015-11-02 23:13:04      阅读:392      评论:0      收藏:0      [点我收藏+]

标签:

1、数据准备

   这里,我用文件存储了一些数据,如果在真实开发环境下,可以用数据库存储。

  他们的字段分别是:selfId(自己本身ID),praentId(父类ID),childId(子类ID),depth(深度,默认为0),expand(扩展,请看代码).如果是数据库存储的话,我们可以记录评论时间,评论人,评论人头像等等信息...

1,0,3,0,true
2,0,-1,0,true
3,1,4,0,true
4,3,-1,0,true
5,3,-1,0,true

2、计算

  1.实例,这里我取名为TreeNode,封装了单个评论的实例。

public class TreeNode implements Comparable<TreeNode> {

	private int selfId;
	private int parentId;
	private int childId;
	private int depth = 0; // 默认深度为0
	private boolean expand = true;

	public TreeNode() {
		super();
	}

	public TreeNode(int selfId, int parentId, int childId, int depth, boolean expand) {

		this.selfId = selfId;
		this.parentId = parentId;
		this.childId = childId;
		this.depth = depth;

		if (expand) {

			ArrayList<TreeNode> nodeS = null;
			nodeS = NodeTreeUtil.getTreeNodesById(selfId); // 根据ID获取节点

			for (TreeNode treeNode : nodeS) {

				if (this.childId == -1) {
					NodeTreeUtil.setTreeNodes(new TreeNode(treeNode.getSelfId(), treeNode.getParentId(),
							treeNode.getChildId(), depth + 1, false));
				} else {
					NodeTreeUtil.setTreeNodes(new TreeNode(treeNode.getSelfId(), treeNode.getParentId(),
							treeNode.getChildId(), depth + 1, true));
				}

			}

		}

	}

	public int getSelfId() {
		return selfId;
	}

	public void setSelfId(int selfId) {
		this.selfId = selfId;
	}

	public int getParentId() {
		return parentId;
	}

	public void setParentId(int parentId) {
		this.parentId = parentId;
	}

	public int getChildId() {
		return childId;
	}

	public void setChildId(int childId) {
		this.childId = childId;
	}

	public int getDepth() {
		return depth;
	}

	public void setDepth(int depth) {
		this.depth = depth;
	}

	public boolean isExpand() {
		return expand;
	}

	public void setExpand(boolean expand) {
		this.expand = expand;
	}

	@Override
	public int compareTo(TreeNode o) {

		if (this.depth > o.getDepth()) {
			return (this.depth - o.getDepth());
		}
		if (this.depth < o.getDepth()) {
			return (this.depth - o.getDepth());
		}

		return 0;
	}

}

   2. NodeTreeUtil类封装了一些简单的方法操作:

public class NodeTreeUtil {
	
	public static ArrayList<TreeNode> treeNodes = new ArrayList<TreeNode>();

	public static ArrayList<TreeNode> getTreeNodes() {
		
		if(treeNodes == null){
			return new ArrayList<TreeNode>();
		}
		return treeNodes;
	}

	public static void setTreeNodes(TreeNode treeNode) {
		
		NodeTreeUtil.getTreeNodes().add(treeNode);
	}

	
	/**
	 * 读取文件内容,封装nodeList
	 * @param fileName
	 * @author:Tian_dd
	 * @blog: tian-dd.top
	 */
	public static ArrayList<TreeNode> readFileByLines(String fileName) {
		File file = new File(fileName);
		BufferedReader reader = null;
		try {

			reader = new BufferedReader(new FileReader(file));
			String tempString = null;
			ArrayList<TreeNode> treeNodes = new ArrayList<TreeNode>();

			while ((tempString = reader.readLine()) != null) {
				String[] strings = tempString.split(",");
				TreeNode treeNode = new TreeNode();
				treeNode.setSelfId(Integer.parseInt(strings[0]));
				treeNode.setParentId(Integer.parseInt(strings[1]));
				treeNode.setChildId(Integer.parseInt(strings[2]));
				treeNode.setDepth(Integer.parseInt(strings[3]));
				treeNode.setExpand(Boolean.parseBoolean(strings[4]));
				treeNodes.add(treeNode);
			}
			
			reader.close();
			return treeNodes;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
				}
			}
		}
		return null;
	}

	public static ArrayList<TreeNode> getNodeList() {

		ArrayList<TreeNode> treeNodes = readFileByLines(
				"/Users/tianduoduo/Documents/workspace/TreeNode/src/com/tian/resource/source.txt");

		return treeNodes;
	}
	
	public static ArrayList<TreeNode> initNodeTree(){
		return new ArrayList<TreeNode>();
	}

	/**
	 * 获取相同父节点的节点
	 * @param selfId
	 * @author:Tian_dd
	 * @blog: tian-dd.top
	 */
	public static ArrayList<TreeNode> getTreeNodesById(int selfId) {

		ArrayList<TreeNode> treeNodes = new ArrayList<TreeNode>();

		ArrayList<TreeNode> totalNodeS = NodeTreeUtil.getNodeList();

		for (TreeNode treeNode : totalNodeS) {
			if (treeNode.getParentId() == selfId) {
				treeNodes.add(treeNode);
			}
		}

		return treeNodes;

	}

/**
 * 打印结构
 * @param treeNodes
 * @author:Tian_dd
 * @blog: tian-dd.top
 */
	public static void printListFormat(ArrayList<TreeNode> treeNodes){
		
		Collections.sort(treeNodes);
		
		for (TreeNode treeNode : treeNodes) {
			System.out.print(treeNode.getSelfId() + "==");
			System.out.print(treeNode.getParentId() + "==");
			System.out.print(treeNode.getChildId() + "==");
			System.out.print(treeNode.getDepth() + "==");
			System.out.println(treeNode.isExpand());
			
		}
		
	}
}

   3.让我们测试一下看看...

public class TreeNodeTest {
	
public static void main(String[] args) throws Exception{
		
		new TreeNode(0, 0, 0, 0,true);
		
		System.out.println(NodeTreeUtil.getTreeNodes().size()) ;
		
		NodeTreeUtil.printListFormat(NodeTreeUtil.getTreeNodes());
		
		结果:
		1==0==3==1==true
                2==0==-1==1==true
                3==1==4==2==true
                4==3==-1==3==true
                5==3==-1==3==true
                		
                		
                		
	}

}

public static void main(String[] args) throws Exception{
		
		new TreeNode(1, 0, 3, 0,true);
		
		System.out.println(NodeTreeUtil.getTreeNodes().size()) ;
		
		NodeTreeUtil.printListFormat(NodeTreeUtil.getTreeNodes());
		
                	结果:
                3==1==4==1==true
                4==3==-1==2==true
                5==3==-1==2==true
		
	}

}

当我们知道,每个节点的深度,子节点和父节点时,展示这些评论就不是问题了。。。

3、扩展

  1. 实际开发,字段扩展

  2.  文件换成数据库

  3.  这里可以获取任意一个节点下面的所有节点,实际中,我们可以只获取它下面的2个“深度”的评论,提高性能。

  4.  性能问题有待提高


评价体系的树结构

标签:

原文地址:http://my.oschina.net/tdd/blog/525062

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!