java - 如何根据化学式划分字符串的内容?

标签 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 中。

最佳答案

当您迭代时,您基本上需要计算 token 。括号是简单的标记。数字非常简单 - 只要下一个字符是数字,您就必须继续下去。

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

如果您不能依靠标准化资本化,您的生活就会变得更加困难。

关于java - 如何根据化学式划分字符串的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54581219/

相关文章:

javascript - 如何使用正则表达式进行一些 Javascript 字符串操作?

java - 是否有可能有一个采用通用 Comparable 的方法?

java - 使用循环最佳实践创建 StringBuilder

java - 为什么 HTTPServlet 是一个抽象类?任何功能原因?

java - 动画运行后如何放置文本?

c++ - 哪个更好地检查 std::string 中是否存在字符?查找还是 find_first_of?

arrays - 文件名、目录名或卷标语法不正确 - 尝试在 go lang 中读取文件时

java - 在java中将不同的子类存储为父类是否不好

android - 读取 ListView 的 EditText 的完成输入

java - 使用 ArrayList 排序进行图形绘制排序