首页 > 解决方案 > 如何根据化学式划分字符串的内容?

问题描述

我必须验证一个应该模仿化学公式的字符串(不包括电荷(+/-)等符号),并且它必须尊重公式的编写方式(正确使用括号,每个元素最多两个字母,以及缺少不是括号的非字母数字字符)。但是,它不需要知道提交的分子是否能够存在 - 仅当字符串本身有效时。

假设要验证的字符串的内容如下所示:“Na3(CO2)3”

假设我已经验证了字符串不为空并且没有任何非法字符或不正确使用括号,则有必要将字符串分隔开来,比如说符号,这样我就可以存储各个元素(我指的是所有元素。在这种情况下,是 3 个 Na 和 3 个 CO2 粒子)。

所以应该这样划分:

"Na",
"3",
"(",
"C"
"O"
"2"
")"
"3"

我试图用 a 来划分它,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 中。

标签: javastringarraylist

解决方案


当您进行迭代时,您基本上需要计算令牌。括号是简单的标记。数字很​​简单——只要下一个字符是数字,你就必须继续前进。

真正的技巧是元素名称的字符。有几种方法可以解决这个问题。如果您可以使用标准符号计算元素,您可以简单地假设小写字母是当前标记的延续,而大写字母是新标记的开始。因此 NaCl 会正确地变成两个标记,Na 和 Cl,而 CO2 会变成三个标记,C、O 和 2。

如果你不能指望标准化的大写,你的生活会变得更加艰难。


推荐阅读