java如何根据化学式划分字符串的内容?
我必须验证一个模拟化学公式的字符串(不包括电荷(+/-)等符号),并且必须考虑公式的编写方式(正确使用括号,每个元素最多两个字母,并且没有非括号的非字母数字字符)。然而,它不需要知道提交的分子是否能够存在——只要字符串本身是有效的
假设要验证的字符串的内容如下所示:“Na3(CO2)3”
假设我已经验证了字符串不是空的,并且它没有任何非法字符或不正确使用括号,那么就有必要将字符串分隔成符号,这样我就可以存储单个元素(我指的是所有元素。在本例中,3个Na和3个CO2粒子)
所以应该这样划分:
"Na",
"3",
"(",
"C"
"O"
"2"
")"
"3"
我试图用一个for
来分隔它,但是有太多的条件来“分隔”字符串,所以我不确定如何正确地进行分隔-尤其是考虑到一个元素可以有1个或2个字符
目前,我的代码看起来像这样,忽略了其他易于验证的东西
public boolean validerFormuleChimique(String formuleChimique, StringWrapper message)
{
ArrayList<String> symbolSubmited = new ArrayList<String>();
symbolSubmited.add(new String());
symbolSubmited.get(0).equals("");
for (int i =0; i< formuleChimique.length(); i++)
{
if(!Character.isLetterOrDigit(formuleChimique.charAt(i)) &&
( formuleChimique.charAt(i) != '(' ||
formuleChimique.charAt(i) != ')' ))
{
message.contenu = messagesErreur[9];
return false;
}
}
return false;
}
代码中的另一个问题是,我无法在ArrayList中使用+=修改字符串。我可以使用数组,但在验证之前,无法知道公式的长度或长度。就是这样
我希望不仅可以验证公式,还可以将公式的每个“符号”(包括数字和括号)存储在字符串的ArrayList中
# 1 楼答案
如果可以假设小写字母是当前标记的延续,则可以使用以下示例:
这是输出:
# 2 楼答案
在迭代过程中,基本上需要计算令牌。括号是简单的标记。数字很简单——只要下一个字符是数字,你就必须继续
真正的诀窍是元素名的字符。有几种方法可以做到这一点。如果可以使用标准符号来计算元素,则可以简单地假设小写是当前标记的延续,而大写是新标记的开始。因此,NaCl会正确地转化为两种代币Na和Cl,而CO2会转化为三种代币C、O和2
如果你不能指望标准化资本化,你的生活就会变得更加艰难