嵌套对象解析器的字符串

你好


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


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


它得到一个String公式 ( C6H14 + O2 => CO2 + H2O) 并将其划分为不同的对象(Molecule(s) 有一个 Element(s) 列表,用于存储名称和数量),然后返回。注意*我将其设置为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;

        }

    }


我从中得到的价值观是完全错误的。第二个 list on side2是空的, list1和2on 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值。


holdtom
浏览 75回答 2
2回答

手掌心

我通过使用一个临时的 Molecule 对象变量来解决它,然后将其插入到列表中。public Molecule[][] ParseString(String formula) {List[] temp = new List[] {&nbsp; &nbsp; new ArrayList<Molecule>(),&nbsp; &nbsp; new ArrayList<Molecule>()};List<Element> ell = new ArrayList<>();String crnN = null;int crnQ=0;int side = 0;for (int i=0;i<formula.length()+1;i++) {&nbsp; &nbsp; String d;&nbsp; &nbsp; try { d = formula.substring(i,i+1); } catch (Exception e) { d = formula.substring(i-1); }&nbsp; &nbsp; if (Character.isWhitespace(d.charAt(0))) continue;&nbsp; &nbsp; if (isNumber(d)) {&nbsp; &nbsp; &nbsp; &nbsp; crnQ = Integer.parseInt(crnQ+d);&nbsp; &nbsp; } else if (d == d.toUpperCase()) {&nbsp; &nbsp; &nbsp; &nbsp; if (crnN != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ell.add(new Element(crnN,crnQ));&nbsp; &nbsp; &nbsp; &nbsp; crnN = d;&nbsp; &nbsp; &nbsp; &nbsp; crnQ = 0;&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; crnN = crnN + d;&nbsp; &nbsp; }}Molecule tempM = new Molecule();boolean newMol = false;for (Element e:ell) {&nbsp; &nbsp; String n = e.getName();&nbsp; &nbsp; if (n.charAt(0) == "+".charAt(0)) {&nbsp; &nbsp; &nbsp; &nbsp; newMol = true;&nbsp; &nbsp; &nbsp; &nbsp; temp[side].add(tempM);&nbsp; &nbsp; &nbsp; &nbsp; tempM = new Molecule();&nbsp; &nbsp; }&nbsp; &nbsp; if (n.charAt(0) == "=".charAt(0)) {&nbsp; &nbsp; &nbsp; &nbsp; newMol = true;&nbsp; &nbsp; &nbsp; &nbsp; if (side == 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp[side].add(tempM);&nbsp; &nbsp; &nbsp; &nbsp; side = 1;&nbsp; &nbsp; &nbsp; &nbsp; tempM = new Molecule();&nbsp; &nbsp; }&nbsp; &nbsp; if (n.charAt(0) == ">".charAt(0)) {&nbsp; &nbsp; &nbsp; &nbsp; side = 1;&nbsp; &nbsp; &nbsp; &nbsp; tempM = new Molecule();&nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; }&nbsp; &nbsp; if (newMol) {&nbsp; &nbsp; &nbsp; &nbsp; newMol = false;&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; tempM.addElement(e);&nbsp; &nbsp; }}temp[1].add(tempM);return new Molecule[][]{&nbsp; &nbsp; &nbsp; &nbsp; ((Molecule[]) temp[0].toArray(new Molecule[temp[0].size()])),&nbsp; &nbsp; &nbsp; &nbsp; ((Molecule[]) temp[1].toArray(new Molecule[temp[1].size()]))};

30秒到达战场

很奇怪的代码。我建议进行一些重构1)使用“=>”字符串拆分您的公式并获得两个公式(左和右),您可以分别解析它们。String delim="=>";int p=s.indexOf(delim);&nbsp;String left=s.substring(0, p);&nbsp;String right=s.substring(p+delim.length());List<Molecule> leftMolecules=parse(left);List<Molecule> rightMolecules=parse(right);2)创建parse解析公式标记的函数List<Molecule> parse(String formula) {&nbsp; String [] molecules = formula.split("\\+"); // + is special character and requires escaping&nbsp; List<Molecule> result = new ArrayList<>();&nbsp; for (String m : molecules) {&nbsp; &nbsp; &nbsp;m = m.trim(); // remove leading and trailing spaces&nbsp; &nbsp; &nbsp;// here you parse single molecule like H2O etc&nbsp; &nbsp; &nbsp;...&nbsp; }&nbsp; return result;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java