首页 > 解决方案 > 嵌套对象解析器的字符串

问题描述

你好

我正在编写一个图形界面程序来解决化学方程式和其他功能,例如在不同的窗口中显示元素周期表。

正如标题所暗示的那样,我遇到了对象解析器的字符串问题,并希望获得一些帮助以使其正常工作。

它得到一个String公式C6H14 + O2 => CO2 + H2O(注意*我将其设置为void仅用于测试目的。

我将函数分为两部分:第一部分读取StringElement 对象;名称和数量。第二部分制作 Molecule 对象并检查一个分子从哪里开始,另一个分子在哪里结束,并相应地放置元素对象。这就是为什么我不过滤掉诸如+,=和之类的数字操作>

解析器:

    public void formatFormula(String formula) {
    List[] temp = new List[] {
        new ArrayList<Molecule>(),
        new ArrayList<Molecule>()
    };
    List<Element> ell = new ArrayList<>();
    boolean newMol = true;
    String crnN = null;
    int crnQ=0;
    int side = 0;
    for (int i=0;i<formula.length()+1;i++) {
        String d;
        try { d = formula.substring(i,i+1); } catch (Exception e) { d = formula.substring(i-1); }
        if (Character.isWhitespace(d.charAt(0))) continue;

        if (isNumber(d)) {
            crnQ = Integer.parseInt(crnQ+d);
        } else if (d == d.toUpperCase()) {
            if (crnN != null)
                ell.add(new Element(crnN,crnQ));
            crnN = d;
            crnQ = 0;
        } else {
            crnN = crnN + d;
        }
    }
    Element e;
    for (int i=0;i<ell.size();i++) {
        e = ell.get(i);
        if (e.getName().charAt(0) == "+".charAt(0)) {
            newMol = true;
            continue;
        }
        if (e.getName().charAt(0) == "=".charAt(0) || e.getName().charAt(0) == ">".charAt(0)) {
            newMol = true;
            side = 1;
            continue;
        }

        if (newMol) {
            temp[side].add(new Molecule());
            newMol=false;
        } else {
            ((Molecule)temp[side].get(temp[side].size()-1)).addElement(e);
        }
    }
    // Debugging.
    for (Object f:temp[1]) {
        System.out.println(((Molecule) f).getElements().get(0).getName());

    }
}

我从中得到的价值观是完全错误的。第二个 list on side2是空的, list12on side2具有相同的值,并且没有一个 Molecule 对象具有多个元素。

它应该返回一个分子的二维数组,一个在箭头之前,一个在箭头之后。那些 Molecule 对象存储 Element 对象。

输入: C6H14 + O2 => CO2 + H2O 输出:

    C6H14         +     O2              =>     CO2            +     H2O
Obj(Molecule){    | Obj(Molecule){      || Obj(Molecule){     | Obj(Molecule){
Obj(Element){C:6} | Obj(Element){O:2}}  || Obj(Element){C:1}  | Obj(Element){H:2}
Obj(Element){H:14}}                     || Obj(Element){O:2}} | Obj(Element){O:1}}

注意*这只是对象的表示。但是Molecules 存储一个 s 列表,该列表Element又存储 aString和一个int值。

标签: java

解决方案


很奇怪的代码。

我建议进行一些重构

1)使用“=>”字符串拆分您的公式并获得两个公式(左和右),您可以分别解析它们。

String delim="=>";
int p=s.indexOf(delim); 
String left=s.substring(0, p); 
String right=s.substring(p+delim.length());
List<Molecule> leftMolecules=parse(left);
List<Molecule> rightMolecules=parse(right);

2)创建parse解析公式标记的函数

List<Molecule> parse(String formula) {
  String [] molecules = formula.split("\\+"); // + is special character and requires escaping
  List<Molecule> result = new ArrayList<>();
  for (String m : molecules) {
     m = m.trim(); // remove leading and trailing spaces
     // here you parse single molecule like H2O etc
     ...
  }
  return result;
}

推荐阅读