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 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)
欢迎给一下解决办法