常用算法-将文件列表转换为文件树

/**
 * 将文件列表转换为文件树
 * 
 * @author guoenjing
 *
 */
public class FlatFilePathsToTreeNode {
	public static class Node extends File {
		private static final long serialVersionUID = 1L;
		private List<Node> children;
		private String[] segments;

		public Node(String[] segments) {
			super(segmentsToPath(segments));
			this.segments = segments;
			this.children = new ArrayList<Node>();
		}

		public void addChild(Node child) {
			if (child == null) {
				return;
			}
			int index = children.indexOf(child);
			if (index == -1) {
				children.add(child);
			}
		}

		public String[] getSegments() {
			return segments;
		}

		public List<Node> getChildren() {
			return children;
		}
		
		@Override
		public File[] listFiles() {
			return children.toArray(new Node[children.size()]);
		}

		public static String segmentsToPath(String[] segments) {
			if (segments == null || segments.length == 0) {
				return null;
			}
			String rootSegment = segments[0];
			String[] restSegments = Arrays.copyOfRange(segments, 1, segments.length);
			Path path = Paths.get(rootSegment, restSegments);
			return path.toString();
		}

		public static Node createAllNode(Node rootNode, List<Node> allNodes, String[] segments) {
			if (Arrays.equals(rootNode.getSegments(), segments)) {
				return rootNode;
			}
			for (Node currentNode : allNodes) {
				if (Arrays.equals(currentNode.getSegments(), segments)) {
					return currentNode;
				}
			}
			Node currentNode = new Node(segments);
			allNodes.add(currentNode);
			Node parentNode = createAllNode(rootNode, allNodes, Arrays.copyOf(segments, segments.length - 1));
			parentNode.addChild(currentNode);
			return currentNode;
		}
		
		public static Node filePathToTreeNode(List<String> filePaths) {
			List<String[]> allSegments = 求多个文件路径的最大共同父路径.pathsToSegments(filePaths);
			List<String> commonSegment = 求多个文件路径的最大共同父路径.getCommonSegments(allSegments);
			Node rootNode = new Node(commonSegment.toArray(new String[commonSegment.size()]));
			List<Node> tempAllNode = new ArrayList<Node>();
			for(String[] segments : allSegments) {
				Node.createAllNode(rootNode, tempAllNode, segments);
			}
			return rootNode;
		}
	}

	public static void main(String[] args) {
		List<String > filePaths = new ArrayList<String>();
		filePaths.add("C:/f1/f11/f111.c");
		filePaths.add("C:/f1/f11/f1122.c");
		filePaths.add("C:/f1/f12/f121.c");
		filePaths.add("C:/f1/f12/f122.c");
		filePaths.add("C:/");
		
		Node rootNode = Node.filePathToTreeNode(filePaths);
		
		SimplePropertyPreFilter filter = new SimplePropertyPreFilter("segments","children");
		String jsonString = JSONObject.toJSONString(rootNode, filter);
		System.out.println(jsonString);
//		{
//			"children": [{
//				"children": [{
//					"children": [{
//						"children": [],
//						"segments": ["C:\\", "f1", "f11", "f111.c"]
//					}, {
//						"children": [],
//						"segments": ["C:\\", "f1", "f11", "f1122.c"]
//					}],
//					"segments": ["C:\\", "f1", "f11"]
//				}, {
//					"children": [{
//						"children": [],
//						"segments": ["C:\\", "f1", "f12", "f121.c"]
//					}, {
//						"children": [],
//						"segments": ["C:\\", "f1", "f12", "f122.c"]
//					}],
//					"segments": ["C:\\", "f1", "f12"]
//				}],
//				"segments": ["C:\\", "f1"]
//			}],
//			"segments": ["C:\\"]
//		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值