使用Java将newick分层字符串转换为分层JSON对象

时间:2016-07-15 16:33:09

标签: java

我正在研究newick格式。 https://en.wikipedia.org/wiki/Newick_format。 我有一个树的新词串

(ABC,(STU,VWX)DEF,(GHI,JKL)MNO)PQR;

如何将此字符串转换为分层JSON对象,如

JSONObject tree = {
  name: 'PQR',
  children: [{
    name: 'ABC'
  }, {
    name: 'DEF',
    children: [{
      name: 'STU'
    }, {
      name: 'VWX'
    }]
  }, {
    name: 'MNO',
    children: [{
      name: 'GHI'
    }, {
      name: 'JKL'
    }]
  }]
}

这是我尝试过但无法进一步思考如何填充根节点的子节点

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

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

public class Series1 {

    public static void main(String[] args) throws JSONException
    {
    String data="(ABC,(STU,VWX,EFG)DEF,YZA,HIJ,(GHI,JKL)MNO,BCD)PQR";
    JSONObject tree=new JSONObject();
    tree.put("name",data.substring(data.lastIndexOf(")")+1,data.length()));
    tree.put("children", getChildren(data.substring(1,data.lastIndexOf(")"))));
    }
    public static JSONArray getChildren(String children) throws JSONException
    {
        JSONArray childrenArray=new JSONArray();
        List<Integer> commaIndexList=new ArrayList<Integer>();
        List<String> childrenStringList=new ArrayList<String>();
        for (int index = children.indexOf(",");index >= 0;index = children.indexOf(",", index + 1))
            {
            if(children.substring(index+1, index+2).equalsIgnoreCase("("))
                {
                    commaIndexList.add(index);
                    System.out.println(index);
                }
            }
        childrenStringList.add(children.substring(0, commaIndexList.get(0)));
        childrenStringList.add(children.substring(commaIndexList.get(commaIndexList.size()-1)+1));
        for(int i=0;i<commaIndexList.size()-1;i++)
        {
            childrenStringList.add(children.substring(commaIndexList.get(i)+1, commaIndexList.get(i+1)));
        }
        for(String childrenString:childrenStringList)
        {
            JSONObject childObject=new JSONObject();
            if(childrenString.lastIndexOf(")")>0)
            {
                childObject.put("name", childrenString.substring(childrenString.lastIndexOf(")")+1));
                childObject.put("children", getChildren(childrenString.substring(childrenString.indexOf("(")+1,childrenString.lastIndexOf(")"))));
            }
            else
            {
                childObject.put("name",childrenString);
            }
            childrenArray.put(childObject);


        }

        return childrenArray;
    }

}

1 个答案:

答案 0 :(得分:-1)

我说这个问题类似于评估数学表达式,例如2 + 5 *(10-3)=?

    +
2       *
     5      -
          10   3

关键是使用堆栈操作来重新排列&#39; inorder&#39;树形结构成&#39; postorder&#39;在这种情况下是2 5 10 3 - * +

这是一个没有括号的明确形式,因此很容易读取机器处理。如果你有兴趣,我可以看一下。