java实现树形结构把数组{"1", "1-3-4", "1-2", "1-2"}转变成如图的树

java实现树形结构,可以把String[] a = {"1", "1-3-4", "1-2", "1-2"}这个数组,转变成如图的树json么?
图片说明

谈谈我的思路吧 比如说有一个 "a-b-c-d"这样的形式,有类似 obj {id, obj[] children}这样的类
解析该字符串 先获得 a 和剩下的 b-c-d ,我在当前的obj[]下判断是否有是否有 a
没有的话创建这样一个obj 有的话进入这个obj的children,
然后接着获取b 和c-d 执行刚才的动作 不过判断的是children

我觉得可以。
不过要先从数组{"1", "1-3-4", "1-2", "1-2"}之中确定树形结构的上下级的关系。
确定后新建class类 用gson转就可以了

以下class类供参考

 public class Tree {

    private String id;
    private Tree   children;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public Tree getChildren() {
        return children;
    }
    public void setChildren(Tree children) {
        this.children = children;
    }

}

package com.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

public class TestDemo {

public static void main(String[] args) {

    TestDemo testDemo=new TestDemo();
    testDemo.demo();


}



private void demo(){
    String[] a = {"1", "1-3-4", "1-2", "1-2"};
    List<Map<String, String>> list=new ArrayList<Map<String,String>>();
    Map<String, String> item=new HashMap<String, String>();

    for(String str:a){
        String strArr[]=str.split("-");
        for(int i=0;i<strArr.length;i++){
            item=new HashMap<String, String>();
            if(i==0){
                item.put("id", strArr[i]);
                item.put("parentId", "");
            }else{
                item.put("id", strArr[i]);
                item.put("parentId", strArr[i-1]);
            }
            // 判断是否已经存在值相同的 
            boolean isAdd=true;
            for(Map<String, String> itemT:list){
                if(itemT.get("id").equals(item.get("id"))&&itemT.get("parentId").equals(item.get("parentId"))){
                    isAdd=false;
                }
            }
            if(isAdd){
                list.add(item);
            }

        }

    }
    for(Map<String, String> itemT:list){
        System.out.println(itemT.get("id")+"\t"+itemT.get("parentId"));
    }
    // 开始递归
    JsonArray jsonArray=new JsonArray();
    for(Map<String, String> itemT:list){
        if("".equals(itemT.get("parentId"))){
            JsonObject jsonObject=new JsonObject();
            jsonObject.addProperty("id", itemT.get("id"));
            jsonArray.add(jsonObject);
            seracherItem(jsonObject,list);

        }
    }

    System.out.println(jsonArray.toString());


}
/**
 * 递归调用
 * @param jsonObject
 * @param list
 */
private void seracherItem(JsonObject jsonObject,List<Map<String, String>> list){
    JsonArray jsonArray=new JsonArray();
    jsonObject.add("children",jsonArray);

    for(Map<String, String> itemT:list){

        if(jsonObject.get("id").getAsString().equals(itemT.get("parentId"))){
            System.out.println(jsonObject.get("id").getAsString()+"  "+itemT.get("parentId"));

            JsonObject jsonObjectT=new JsonObject();
            jsonObjectT.addProperty("id", itemT.get("id"));
            jsonArray.add(jsonObjectT);
            seracherItem(jsonObjectT,list);


        }

    }
}

}


用到任意的json包就可以 我用的是goole的gson解析包 输出就是你想要的结果

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class TestMain {

public static void main(String args[]) throws Exception {
    String[] a = {"1", "1-3-4", "1-2", "1-2"};
    JSONArray baseArray = new JSONArray();
    JSONObject tempObj = null;
    JSONArray tempArray;
    for (int i=0; i<a.length; i++) {
        tempArray = baseArray;
        String[] split = a[i].split("-");
        for (int j=0; j<split.length; j++) {
            int index = indexOfId(split[j], tempArray);
            if (index < 0) {
                tempObj = new JSONObject();
                tempArray.put(tempObj);
                tempArray = new JSONArray();
                tempObj.put("id", split[j]);
                tempObj.put("children", tempArray);
            } else {
                tempArray = ((JSONObject) tempArray.get(index)).getJSONArray("children");
            }
        }
    }
    System.out.println(baseArray.toString());
}

public static int indexOfId(String key, JSONArray baseArray) throws JSONException {
    for (int i=0; i<baseArray.length(); i++) {
        JSONObject obj = (JSONObject) baseArray.get(i);
        if (key.equals(obj.get("id"))) {
            return i;
        }
    }
    return -1;
}

}


写的有点粗糙 仅供参考

也可以利用键字对的方式,先转换成map性质,再转换成JSON
public class TestJSON {

public static void main(String[] args) {

TestDemo testDemo=new TestDemo();
testDemo.demo();

}

private void demo(){
String[] a = {"1", "1-3-4", "1-2", "1-2"};
List> list=new ArrayList>();
Map item=new HashMap();

for(String str:a){
    String strArr[]=str.split("-");
    for(int i=0;i<strArr.length;i++){
        item=new HashMap<String, String>();
        if(i==0){
            item.put("id", strArr[i]);
            item.put("parentId", "");
        }else{
            item.put("id", strArr[i]);
            item.put("parentId", strArr[i-1]);
        }

        boolean isAdd=true;
        for(Map<String, String> itemT:list){
            if(itemT.get("id").equals(item.get("id"))&&itemT.get("parentId").equals(item.get("parentId"))){
                isAdd=false;
            }
        }
        if(isAdd){
            list.add(item);
        }

    }

}
for(Map<String, String> itemT:list){
    System.out.println(itemT.get("id")+"\t"+itemT.get("parentId"));
}

JsonArray jsonArray=new JsonArray();
for(Map<String, String> itemT:list){
    if("".equals(itemT.get("parentId"))){
        JsonObject jsonObject=new JsonObject();
        jsonObject.addProperty("id", itemT.get("id"));
        jsonArray.add(jsonObject);
        seracherItem(jsonObject,list);

    }
}

System.out.println(jsonArray.toString());

}
/**

  • 递归调用
  • @param jsonObject
  • @param list
    */
    private void seracherItem(JsonObject jsonObject,List> list){
    JsonArray jsonArray=new JsonArray();
    jsonObject.add("children",jsonArray);

    for(Map itemT:list){

    if(jsonObject.get("id").getAsString().equals(itemT.get("parentId"))){
        System.out.println(jsonObject.get("id").getAsString()+"  "+itemT.get("parentId"));
    
        JsonObject jsonObjectT=new JsonObject();
        jsonObjectT.addProperty("id", itemT.get("id"));
        jsonArray.add(jsonObjectT);
        seracherItem(jsonObjectT,list);
    

      }

      }
     }

import java.util.ArrayList;
import java.util.List;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

public class SuanFaTi {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    String[] arr = { "1", "1-3-4", "1-2", "1-2" };
    String[] arr2 = { "1", "1-3", "1-2", "1-2","2", "2-4" };
    try {
        array2Tree(arr);
        array2Tree(arr2);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public static void array2Tree(String[] arr) throws Exception {
    if (null == arr) {
        throw new Exception();
    }

    List<Node> nodes = new ArrayList<SuanFaTi.Node>();
    for (int i = 0; i < arr.length; i++) {
        String[] tmpArr = arr[i].split("-");

// printArr(tmpArr);
// 长度为1的话,为第一个节点
if (tmpArr.length == 1) {
Node node = new Node();
node.id = tmpArr[0];
node.parentId = "";
boolean isAdded = false;
for (int j = 0; j < nodes.size(); j++) {
if (nodes.get(j).id.equals(node.id) && nodes.get(j).parentId.equals(node.parentId)) {
isAdded = true;
break;
}
}
if (!isAdded) {
nodes.add(node);
}

        } else {
            for (int j = 0; j < tmpArr.length; j++) {
                Node node = new Node();
                if (j == 0) {
                    node.id = tmpArr[j];
                    node.parentId = "";
                } else {
                    node.id = tmpArr[j];
                    node.parentId = tmpArr[j - 1];
                }
                boolean isAdded = false;
                for (int n = 0; n < nodes.size(); n++) {
                    if (nodes.get(n).id.equals(node.id)&& nodes.get(n).parentId.equals(node.parentId)) {
                        isAdded = true;
                        break;
                    }
                }
                if (!isAdded) {
                    nodes.add(node);
                }
            }
        }
    }
    System.out.println(nodes.toString());
    //开始转树形
    JsonArray jsonArray = new JsonArray();
    for (int i = 0; i < nodes.size(); i++) {
        //1.找第一个节点
        if (nodes.get(i).parentId.equals("")) {
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", nodes.get(i).id);
            getChildren(jsonObject, (ArrayList<Node>) nodes);
            jsonArray.add(jsonObject);
        }
    }

    System.out.println(jsonArray.toString());

}

public static void getChildren(JsonObject jsonObject,ArrayList<Node>nodes){
    JsonArray jsonArray = new JsonArray();
    jsonObject.add("children",jsonArray);

    for (int i = 0; i < nodes.size(); i++) {
        //1.找第一个节点
        if (nodes.get(i).parentId.equals(jsonObject.get("id").getAsString())) {
            JsonObject object = new JsonObject();
            object.addProperty("id", nodes.get(i).id);
            getChildren(object, (ArrayList<Node>) nodes);
            jsonArray.add(object);
        }
    }
}


public static void printArr(String[] arr) {
    if (arr == null) {
        return;
    }
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }
    System.out.println();
}

private static class Node {
    public String id;
    public String parentId;
    @Override
    public String toString() {
        return "Node [id=" + id + ", parentId=" + parentId + "]";
    }

}

}

输出:
[Node [id=1, parentId=], Node [id=3, parentId=1], Node [id=4, parentId=3], Node [id=2, parentId=1]]
[{"id":"1","children":[{"id":"3","children":[{"id":"4","children":[]}]},{"id":"2","children":[]}]}]
[Node [id=1, parentId=], Node [id=3, parentId=1], Node [id=2, parentId=1], Node [id=2, parentId=], Node [id=4, parentId=2]]
[{"id":"1","children":[{"id":"3","children":[]},{"id":"2","children":[{"id":"4","children":[]}]}]},{"id":"2","children":[{"id":"4","children":[]}]}]

此方法有一个缺点,迭代层次太深会崩溃,堆栈溢出:
Exception in thread "main" java.lang.StackOverflowError
at java.util.LinkedHashMap.afterNodeInsertion(LinkedHashMap.java:299)
at java.util.HashMap.putVal(HashMap.java:663)
at java.util.HashMap.put(HashMap.java:611)
at com.google.gson.JsonObject.add(JsonObject.java:57)

欢迎给一下解决办法