有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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中


共 (2) 个答案

  1. # 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
    
  2. # 2 楼答案

    在迭代过程中,基本上需要计算令牌。括号是简单的标记。数字很简单——只要下一个字符是数字,你就必须继续

    真正的诀窍是元素名的字符。有几种方法可以做到这一点。如果可以使用标准符号来计算元素,则可以简单地假设小写是当前标记的延续,而大写是新标记的开始。因此,NaCl会正确地转化为两种代币Na和Cl,而CO2会转化为三种代币C、O和2

    如果你不能指望标准化资本化,你的生活就会变得更加艰难