java高手请入 数据算法

reyoreyoreyo 2018-04-23 03:28:04
加精
已知一变量
输入:String s="jar.bat,temp/,temp/aa/,temp/jar.bat,temp/rr.txt,temp/aa/44.txt,temp/aa/bb/";
如果将这一变量转换为(格式说明[id,pid,name]:id:序号:pid:上级目录,name:名称)写一算法
输出:s=" [[1,0,"jar.bat"],[2,0,"temp"],[3,2,"jar.bat"],[4,2,"rr.txt"],[5,2,"aa"],[6,5,"44.txt"],[7,5,"bb"]] ";
...全文
4859 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zimo_1993 2018-06-22
  • 打赏
  • 举报
回复
String s="jar.bat,temp/,temp/aa/,temp/jar.bat,temp/rr.txt,temp/aa/44.txt,temp/aa/bb/";
class EntityA {
int id;
int pid;
String name;
public String toString() {
return "["+this.id+","+this.pid+",\""+this.name+"\"]";
}
}
String array[]=s.split(",");
List<EntityA> entityList = new ArrayList<EntityA>();

for(int i=0; i<array.length; i++) {
EntityA a =new EntityA();
a.id=i+1;
String nameArray[] = array[i].split("/");
int len = nameArray.length;
if (len == 1) {
a.name=nameArray[0];
} else {
a.name=nameArray[len-1];
for (int j=0; j<entityList.size(); j++) {
EntityA pEntity = entityList.get(j);
if (pEntity.name.equals(nameArray[len-2])) {
a.pid=j+1;
break;
}
}
}
entityList.add(a);
}
StringBuilder builder = new StringBuilder("[");
for (EntityA entity : entityList) {
builder.append(entity.toString()).append(",");
}
String out= builder.toString();
System.out.println(out.substring(0, out.length()-1)+"]");
guohui_chn 2018-05-29
  • 打赏
  • 举报
回复
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; Pnnnnnjh<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)"] } }
weixin_42138479 2018-05-04
  • 打赏
  • 举报
回复
小白 来看看专家怎么说:思路:先用split方法转换为char[]数组;遍历数组的每个元素,正则表达式search看有没有".",没有就是文件夹,否则是文件,点号后面的东西就是文件类型;本来想写一个树,但是其实不用,对于每个用绝对路径表示的文件,调用split方法,除掉最后一个元素就是它的父亲,在判断父亲的同时判断孩子(比如已经判断出a是b的父亲,那同时记下b是a的孩子,这是两个不同的概念,一个是存储的a结点,另一个是存储在b结点中)。这样一想,嗯,还是要写一个树,或者至少写一个类来表示链表结构好了。
  • 打赏
  • 举报
回复
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)"]
    }
}
用例已全部验证
zhaoht_2218 2018-05-03
  • 打赏
  • 举报
回复

/**
 * @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();
    }
}
zhaoht_2218 2018-05-03
  • 打赏
  • 举报
回复
/** * @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(); } }
reyoreyoreyo 2018-05-02
  • 打赏
  • 举报
回复
引用 15 楼 amx50b 的回复:
[quote=引用 14 楼 reyoreyoreyo 的回复:] [quote=引用 13 楼 amx50b 的回复:] [quote=引用 12 楼 reyoreyoreyo 的回复:] [quote=引用 10 楼 amx50b 的回复:]
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 + '\"' +
                ']';
    }
}
发现bug当 String s = "jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)"; 程序错误 [/quote]你在存temp/jar.bat之前不应该先存在temp/吗?[/quote] 你没注意看问题,是发现bug当 String s = "jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)"; 程序错误 Exception in thread "main" java.lang.NullPointerException at reyo.sdk.utils.test.Test.getMenu(Test.java:48) at reyo.sdk.utils.test.Test.main(Test.java:30)[/quote] 报异常的原因是因为在处理temp/jar.bat文件时要存pid也就是temp/的id 但是你给的字符串中并没有temp/所以报空指针,pid也就不存在[/quote] 要的就是算法?如果给了pid还是算法?
AMX50B 2018-04-27
  • 打赏
  • 举报
回复
引用 14 楼 reyoreyoreyo 的回复:
[quote=引用 13 楼 amx50b 的回复:] [quote=引用 12 楼 reyoreyoreyo 的回复:] [quote=引用 10 楼 amx50b 的回复:]
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 + '\"' +
                ']';
    }
}
发现bug当 String s = "jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)"; 程序错误 [/quote]你在存temp/jar.bat之前不应该先存在temp/吗?[/quote] 你没注意看问题,是发现bug当 String s = "jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)"; 程序错误 Exception in thread "main" java.lang.NullPointerException at reyo.sdk.utils.test.Test.getMenu(Test.java:48) at reyo.sdk.utils.test.Test.main(Test.java:30)[/quote] 报异常的原因是因为在处理temp/jar.bat文件时要存pid也就是temp/的id 但是你给的字符串中并没有temp/所以报空指针,pid也就不存在
reyoreyoreyo 2018-04-27
  • 打赏
  • 举报
回复
引用 13 楼 amx50b 的回复:
[quote=引用 12 楼 reyoreyoreyo 的回复:] [quote=引用 10 楼 amx50b 的回复:]
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 + '\"' +
                ']';
    }
}
发现bug当 String s = "jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)"; 程序错误 [/quote]你在存temp/jar.bat之前不应该先存在temp/吗?[/quote] 你没注意看问题,是发现bug当 String s = "jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)"; 程序错误 Exception in thread "main" java.lang.NullPointerException at reyo.sdk.utils.test.Test.getMenu(Test.java:48) at reyo.sdk.utils.test.Test.main(Test.java:30)
AMX50B 2018-04-27
  • 打赏
  • 举报
回复
引用 12 楼 reyoreyoreyo 的回复:
[quote=引用 10 楼 amx50b 的回复:]
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 + '\"' +
                ']';
    }
}
发现bug当 String s = "jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)"; 程序错误 [/quote]你在存temp/jar.bat之前不应该先存在temp/吗?
reyoreyoreyo 2018-04-26
  • 打赏
  • 举报
回复
引用 6 楼 jian_j_z 的回复:
[quote=引用 1 楼 yangqiu0928 的回复:] 为什么第三个输出的是 [3,2,"jar.bat"] 而不是[3,2,"aa"]
同问,输出好像是有问题的?[/quote]
引用 6 楼 jian_j_z 的回复:
[quote=引用 1 楼 yangqiu0928 的回复:] 为什么第三个输出的是 [3,2,"jar.bat"] 而不是[3,2,"aa"]
同问,输出好像是有问题的?[/quote] 已知一变量 输入:String s="jar.bat,temp/,temp/aa/,temp/jar.bat,temp/rr.txt,temp/aa/44.txt,temp/aa/bb/"; 如果将这一变量转换为(格式说明[id,pid,name]:id:序号:pid:上级目录,name:名称)写一算法 输出:[[1,0,"jar.bat"],[2,0,"temp"],[3,2,"aa"],[4,2,"jar.bat"],[5,2,"rr.txt"],[6,3,"44.txt"],[7,3,"bb"]]
reyoreyoreyo 2018-04-26
  • 打赏
  • 举报
回复
引用 10 楼 amx50b 的回复:
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 + '\"' +
                ']';
    }
}
发现bug当 String s = "jar.bat(26.00B),temp/jar.bat(26.00B),temp/rr.txt(0 B),temp/aa/44.txt(0 B)"; 程序错误
reyoreyoreyo 2018-04-26
  • 打赏
  • 举报
回复
引用 9 楼 yangqiu0928 的回复:
public class Test { static Map<String,Integer> hash = new HashMap<String,Integer>(); static List<TmpObject> list = new ArrayList<TmpObject>(); 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[] arr = s.split(","); for(String tmp : arr){ Integer root_id = 0; String [] tarr = tmp.split("/"); for(String name: tarr){ root_id = findOrCreateRoot(name,root_id); } } System.out.println(Arrays.toString(list.toArray())); } public static Integer findOrCreateRoot(String name,Integer root_id){ Integer id = hash.get(name+root_id); if(null == id){ TmpObject t = new TmpObject(); t.setId(list.size() + 1); t.setName(name); t.setRoot_id(root_id); id = t.getId(); list.add(t); hash.put(t.getName()+root_id, t.getId()); } return id; } } public class TmpObject { private Integer id; private Integer root_id; private String name; public TmpObject(){ this.root_id = 0; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getRoot_id() { return root_id; } public void setRoot_id(Integer root_id) { this.root_id = root_id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "["+this.id+","+this.root_id+",\""+this.name+"\"]"; } }
非常感觉您的及时回复。 再有一进阶的要求,多一判断如果为文件 加上全路径如 源字符串: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)"]]
AMX50B 2018-04-26
  • 打赏
  • 举报
回复
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 + '\"' +
                ']';
    }
}
shayebuhui0 2018-04-26
  • 打赏
  • 举报
回复
public class Test { static Map<String,Integer> hash = new HashMap<String,Integer>(); static List<TmpObject> list = new ArrayList<TmpObject>(); 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[] arr = s.split(","); for(String tmp : arr){ Integer root_id = 0; String [] tarr = tmp.split("/"); for(String name: tarr){ root_id = findOrCreateRoot(name,root_id); } } System.out.println(Arrays.toString(list.toArray())); } public static Integer findOrCreateRoot(String name,Integer root_id){ Integer id = hash.get(name+root_id); if(null == id){ TmpObject t = new TmpObject(); t.setId(list.size() + 1); t.setName(name); t.setRoot_id(root_id); id = t.getId(); list.add(t); hash.put(t.getName()+root_id, t.getId()); } return id; } } public class TmpObject { private Integer id; private Integer root_id; private String name; public TmpObject(){ this.root_id = 0; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getRoot_id() { return root_id; } public void setRoot_id(Integer root_id) { this.root_id = root_id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "["+this.id+","+this.root_id+",\""+this.name+"\"]"; } }
jian_j_z 2018-04-25
  • 打赏
  • 举报
回复
引用 1 楼 yangqiu0928 的回复:
为什么第三个输出的是 [3,2,"jar.bat"] 而不是[3,2,"aa"]
同问,输出好像是有问题的?
reyoreyoreyo 2018-04-25
  • 打赏
  • 举报
回复
<!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 版本
reyoreyoreyo 2018-04-25
  • 打赏
  • 举报
回复
java 混合list不可能实现,望高手出手相助
reyoreyoreyo 2018-04-24
  • 打赏
  • 举报
回复
这个看个人的算法,排序方法 不一样 序号不一样
shayebuhui0 2018-04-24
  • 打赏
  • 举报
回复
为什么第三个输出的是 [3,2,"jar.bat"] 而不是[3,2,"aa"]
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法数据结构。算法代表程序员水平的珠穆朗玛。 本视频由微软全球最有价值专家尹成录制,拒绝念PPT,代码实战数据结构与算法导论。除了传统数据结构算法,加入高并发线程安全数据结构,分布式负载均衡算法,分布式哈希表,分布式排序等等现代算法。  算法,晦涩难懂,却又是IT领域受重视的素养之一。可以说,算法能力往往决定了一个程序员能够走多远。因此,BAT/FLAG等国内外各大名企非常喜欢在面试环节考核求职者的算法编程,这也成为了无数准程序员们过不去的一道“坎”。如何入门并成为一名出色的算法工程师?但无论半路出家还是科班出身,除学生时代搞算法竞赛的同学外真正用心学习过算法数据结构太少太少。对于后期想要学习算法数据结构却不得不面对以下问题:没有自己的知识框架,无法关联知识点,学习效率低有疑问而无人解答,有问题无法理解全靠猜测,一个问题卡好几天市面上资料题解质量参差不齐,正确性未可知Google算法-工程师尹成大哥学习算法

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧