java - 嵌套对象解析器的字符串
问题描述
你好
我正在编写一个图形界面程序来解决化学方程式和其他功能,例如在不同的窗口中显示元素周期表。
正如标题所暗示的那样,我遇到了对象解析器的字符串问题,并希望获得一些帮助以使其正常工作。
它得到一个String
公式C6H14 + O2 => CO2 + H2O
(注意*我将其设置为void
仅用于测试目的。
我将函数分为两部分:第一部分读取String
Element 对象;名称和数量。第二部分制作 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
是空的, list1
和2
on 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}}
注意*这只是对象的表示。但是Molecule
s 存储一个 s 列表,该列表Element
又存储 aString
和一个int
值。
解决方案
很奇怪的代码。
我建议进行一些重构
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;
}
推荐阅读
- uwp - 访问自定义控件中的源文件
- python - 在列表中找到最长的偶数出现
- python - 在带有 Numpy、Pandas 等的 Python 3.7+ 中使用 wfastcgi 在 IIS 上部署 Python Flask 应用程序
- android - Logback Android 不登录发布
- python - 使用正则表达式访问 BeautifulSoup 或 Selenium 中的第一个列表元素内容
- docker - “docker-compose.yml”的路径作为参数
- amazon-web-services - 从 Lambda 调用 API 网关
- javascript - JavaScript 最快验证器添加多个正则表达式进行验证
- java - 如何从子目录中递归获取文件spring-integration
- r - Error data.table/tibble inside myfunc has grouping setp and myfunc is used on a grouped master DT[, myfunc(v1,v2), mygruop]