如何根据化学式对字符串的内容进行划分?

时间:2019-02-07 19:50:30

标签: java string arraylist

我必须验证一个拟模仿化学式的字符串(不包括电荷(+/-)之类的符号),并且必须尊重该式的书写方式(正确使用括号,每个括号最多两个字母)元素,并且没有非括号的非字母数字字符)。但是,不需要知道所提交的分子是否能够存在-仅在字符串本身有效的情况下。

比方说,要验证的字符串内容如下:“ 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中。

2 个答案:

答案 0 :(得分:1)

如果可以假定小写字母是当前标记的延续,则可以使用以下示例:

    public static void main(String[] args) {
    String test = "Na3(CO2)3";
    Pattern r =  Pattern.compile("A[cglmrstu]|B[aehikr]?|C[adeflmnorsu]?|D[bsy]|E[rsu]|F[elmr]?|G[ade]|H[efgos]?|I[nr]?|Kr?|L[airuv]|M[dgnot]|N[abdeiop]?|Os?|P[abdmortu]?|R[abefghnu]|S[bcegimnr]?|T[abcehilm]|U(u[opst])?|V|W|Xe|Yb?|Z[nr]|\\d|\\(|\\)");
    Matcher matcher =r.matcher(test);
    while (matcher.find()) {
        System.out.print("Start index: " + matcher.start());
        System.out.print(" End index: " + matcher.end() + " ");
        System.out.println(matcher.group());
    }
}

这是输出:

Start index: 0 End index: 2 Na
Start index: 2 End index: 3 3
Start index: 3 End index: 4 (
Start index: 4 End index: 5 C
Start index: 5 End index: 6 O
Start index: 6 End index: 7 2
Start index: 7 End index: 8 )
Start index: 8 End index: 9 3

答案 1 :(得分:0)

在进行迭代时,基本上需要计算令牌。括号是简单的标记。数字非常容易-只要下一个字符是数字,您就必须继续前进。

真正的窍门是元素名称的字符。有两种方法可以解决此问题。如果可以使用标准符号来指望元素,则可以简单地假设小写字母是当前标记的延续,而大写字母是新标记的开头。因此,NaCl会正确地变成两个标记,Na和Cl,而CO2会变成三个标记,C,O和2。

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