62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.*;
public class PathConverter {
private final static String FILE_SEPARATOR = "/";
private final static String PATH_SEPARATOR = ",";
private static class Node{
private static int _ID = 0;
private int id;
private int pid;
private String name;
private String absoluteName;
private boolean bFile;
private Map<String,Node> children;
private Node(int pid,boolean bFile,String path, String name){
this.id = _ID++;
this.pid = pid;
this.absoluteName = path;
this.name = name;
this.children = new HashMap<>();
this.bFile = bFile;
}
@Override
public String toString(){
return String.format("[%d,%d,\"%s\"]",id,pid,bFile?absoluteName:name);
}
}
public String convert(String src){
if(src == null || src.length() == 0){
return "";
}
Node root = new Node(0,false,"","");
for(String path : src.split(PATH_SEPARATOR)){
addNode(root,path);
}
Node._ID = 0;
List<Node> nodes = new ArrayList<>();
visitChildren(nodes,root);
nodes.remove(root);
Collections.sort(nodes, new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
return o1.id - o2.id;
}
});
return join(nodes,",");
}
private void addNode(Node root, String path){
String[] parts = path.split(FILE_SEPARATOR);
Node tmp = root;
List<String> visitedParts = new ArrayList<>();
for(int i = 0 ; i < parts.length ; i++){
String part = parts[i];
boolean bFile = false;
if(i==parts.length-1 && !path.endsWith(FILE_SEPARATOR)){
bFile = true;
}
visitedParts.add(part);
if(!tmp.children.containsKey(part)){
Node newNode = new Node(tmp.id,bFile,join(visitedParts,FILE_SEPARATOR),part);
tmp.children.put(newNode.name,newNode);
}
tmp = tmp.children.get(part);
}
}
private String join(Collection<?> col, String delim) {
StringBuilder sb = new StringBuilder();
Iterator<?> iter = col.iterator();
if (iter.hasNext())
sb.append(iter.next().toString());
while (iter.hasNext()) {
sb.append(delim);
sb.append(iter.next().toString());
}
return sb.toString();
}
private void visitChildren(List<Node> nodes,Node node){
nodes.add(node);
if(node.children.size() > 0){
for(Node childNode : node.children.values()) {
visitChildren(nodes, childNode);
}
}
}
public static void main(String[] args){
PathConverter pathConverter = new PathConverter();
System.out.println(pathConverter.convert("jar.bat,temp/,temp/aa/,temp/jar.bat,temp/rr.txt,temp/aa/44.txt,temp/aa/bb/"));
//[1,0,"jar.bat"],[2,0,"temp"],[3,2,"aa"],[4,2,"temp/jar.bat"],[5,2,"temp/rr.txt"],[6,3,"temp/aa/44.txt"],[7,3,"bb"]
System.out.println(pathConverter.convert("1.zip(1002.00B),1/jar.bat(26.00B),1/temp/jar.bat(26.00B),1/temp/rr.txt(0 B),1/temp/aa/44.txt(0 B)"));
//[1,0,"1.zip(1002.00B)"],[2,0,"1"],[3,2,"1/jar.bat(26.00B)"],[4,2,"temp"],[5,4,"1/temp/jar.bat(26.00B)"],[6,4,"1/temp/rr.txt(0 B)"],[7,4,"aa"],[8,7,"1/temp/aa/44.txt(0 B)"]
System.out.println(pathConverter.convert("jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)"));
//[1,0,"jar.bat(26.00B)"],[2,0,"temp"],[3,2,"temp/jar.bat(26.00B)"],[4,2,"temp/rr.txt(0 B)"],[5,2,"aa"],[6,5,"temp/aa/44.txt(0 B)"]
}
}
用例已全部验证
/**
* @date 2018/5/3
*/
public class Test {
public static void main(String[] args) {
String s = "jar.bat,temp/,temp/aa/,temp/jar.bat,temp/rr.txt,temp/aa/44.txt,temp/aa/bb/";
String a = "jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)";
Test t = new Test();
System.out.println(t.format(a));
}
private String format(String s) {
StringBuilder sb = new StringBuilder();
sb.append("[");
String[] newStrings = s.split(",");
for (int i = 0; i < newStrings.length; i++) {
sb.append("[");
if (!newStrings[i].contains("/")) {
sb.append(i + 1).append(",").append(0).append(",").append("\"").append(newStrings[i]).append("\"");
} else {
String[] childStrings = newStrings[i].split("/");
if (childStrings[childStrings.length - 1].contains(".")) {
sb.append(i + 1).append(",").append(childStrings.length).append(",").append("\"").append(childStrings[childStrings.length - 1]).append("\"");
} else {
if (childStrings.length >= 2) {
sb.append(i + 1).append(",").append(childStrings.length).append(",").append("\"").append(childStrings[childStrings.length - 1]).append("\"");
} else {
sb.append(i + 1).append(",").append(0).append(",").append("\"").append(childStrings[childStrings.length - 1]).append("\"");
}
}
}
if (i == newStrings.length - 1) {
sb.append("]");
} else {
sb.append("],");
}
}
sb.append("]");
return sb.toString();
}
}
public class Test {
public static void main(String[] args) {
String s="jar.bat,temp/,temp/aa/,temp/jar.bat,temp/rr.txt,temp/aa/44.txt,temp/aa/bb/";
String[] tar = s.split(",");
List<Model> list = new ArrayList();
Map<String,Integer> files = new HashMap<String,Integer>();
for(int i=0;i<tar.length;i++){
Model model = new Model();
model.setId(i+1);
getMenu(model,files,tar[i]);
list.add(model);
}
System.out.println(pasList(list));
}
public static void getMenu(Model model,Map<String,Integer> map,String menu){
String[] key = menu.split("/");
if(key.length==1){
model.setPid(0);
model.setTarget(key[0]);
}else {
String parent = "";
model.setTarget(key[key.length-1]);
for(int i=0;i<key.length-1;i++){
parent+=(key[i]+"/");
}
model.setPid(map.get(parent));
}
if(menu.endsWith("/"))
map.put(menu,model.getId());
}
public static String pasList(List<Model> list){
String ss = "[";
for(Model model:list){
ss+=model.toString()+",";
}
return ss.substring(1,ss.length()-1)+"]";
}
}
class Model{
private int id;
private int pid;
private String target;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
@Override
public String toString() {
return "[" +
id +
"," + pid +
",\"" + target + '\"' +
']';
}
}
<!DOCTYPE html>
<html>
<head>
<title></title>
<style>
textarea{
font-size: 16px;
outline: none;
border-radius: 5px;
border:1px solid #ccc;
width: 50%;
height: 80px;
}
.button{
width: 60px;
height: 30px;
line-height: 30px;
text-align: center;
border-radius: 5px;
border: 1px solid #ccc;
cursor: pointer;
font-size: 13px;
}
.button:hover{
background: #eee;
}
</style>
</head>
<body>
<textarea id="text"></textarea>
<div class="button" onclick="analysis()">解析</div>
<div id="result"></div>
<script>
// const s="jar.bat,temp/,temp/aa/,temp/jar.bat,temp/rr.txt,temp/aa/44.txt,temp/aa/bb/";
const s="1.zip(1002.00B),1/jar.bat(26.00B),1/temp/jar.bat(26.00B),1/temp/rr.txt(0 B),1/temp/aa/44.txt(0 B)";
document.querySelector('#text').value = s;
function analysis(){
let text = document.querySelector('#text').value;
let arr = text.split(','),//将源字符串以逗号隔开,转换成数组
result = [];//最终输出的结果集
/** 遍历转换的数组 **/
for(var i in arr){
var tempArr = arr[i].split('/'),//将数组的每一项用斜杠拆分
len = tempArr.length;//每一项拆分后数组的长度
if(len > 1){//如果长度大于1,表示有二级或以上目录
for(var k in tempArr){
k = k * 1;//乘以1是将k转化成数字
//查找最终数组中是否已经存在当前项(tempArr[k - 1]表示取上一个“/”中的内容,即父及目录)
let aa = result.find(function(x){return x[2]==tempArr[k - 1]});
//存在,则该项的父及id就是上一个目录的id,不存在,则默认为0
let parentId = aa ? aa[0] : 0;
if(tempArr[k]){//该判断是为了防止空数据出现,比如:temp/,以斜杠拆分后边就多了个空字符串
//如果当前项名称(tempArr[k])跟最终结果的名称相同,并且父及id也相同,则判定重复
var repeatList = result.find(function(x){return x[2]==tempArr[k] && x[1]==parentId})
//如果不重复,则添加到最终的结果集中
!repeatList && result.push([result.length + 1,parentId,tempArr[k]]);
}
}
}else{//只有一级目录,直接添加到结果集
result.push([result.length + 1,0,tempArr[0]]);
}
}
result = JSON.stringify(result);
let html = `<p>源字符串:${text}</p><p>输出结果:${result}</p>`;
document.querySelector('#result').innerHTML = html;
}
</script>
</body>
</html>
以上是js版本,望高手改为 java 版本