为了账号安全,请及时绑定邮箱和手机立即绑定

嵌套对象解析器的字符串

嵌套对象解析器的字符串

holdtom 2022-05-12 18:36:31
你好我正在编写一个图形界面程序来解决化学方程式和其他功能,例如在不同的窗口中显示元素周期表。正如标题所暗示的那样,我遇到了对象解析器的字符串问题,并希望获得一些帮助以使其正常工作。它得到一个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            +     H2OObj(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值。
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

我通过使用一个临时的 Molecule 对象变量来解决它,然后将其插入到列表中。


public Molecule[][] ParseString(String formula) {

List[] temp = new List[] {

    new ArrayList<Molecule>(),

    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++) {

    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;

    }

}


Molecule tempM = new Molecule();

boolean newMol = false;

for (Element e:ell) {

    String n = e.getName();


    if (n.charAt(0) == "+".charAt(0)) {

        newMol = true;

        temp[side].add(tempM);

        tempM = new Molecule();

    }

    if (n.charAt(0) == "=".charAt(0)) {

        newMol = true;

        if (side == 0)

            temp[side].add(tempM);

        side = 1;

        tempM = new Molecule();

    }

    if (n.charAt(0) == ">".charAt(0)) {

        side = 1;

        tempM = new Molecule();

        continue;

    }

    if (newMol) {

        newMol = false;

    } else {

        tempM.addElement(e);

    }

}

temp[1].add(tempM);


return new Molecule[][]{

        ((Molecule[]) temp[0].toArray(new Molecule[temp[0].size()])),

        ((Molecule[]) temp[1].toArray(new Molecule[temp[1].size()]))

};


查看完整回答
反对 回复 2022-05-12
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

很奇怪的代码。


我建议进行一些重构


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;

}


查看完整回答
反对 回复 2022-05-12
  • 2 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信