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()]))
};
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;
}
添加回答
举报