当前位置: 首页 > 面试题库 >

解析表示化学反应的字符串,并验证该反应是否可能

李永寿
2023-03-14
问题内容

我必须编写一个程序,将用户的化学方程式作为输入,例如12 CO2 + 6 H2O-> 2 C6H12O6 + 12
O2,并观察两个位置上的原子量是否相同。有没有什么方法可以轻松地计算和解析?

例如:

12 CO2 + 6 H2O-> 2 C6H12O6 + 12 O2

12 * 2 + 6 * 2-> 2 * 6 + 2 * 12 + 2 * 6 + 12 * 2

在这种情况下,应该有输出“ false”。

这是我的代码,但实际上仅是尝试一些操作:

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    List<String> list = new ArrayList<String>();
    String input = "";
    while (!(input.equals("end"))) {
        input = s.nextLine();
        list.add(input);
    }
    list.remove(list.size() - 1);
    for (int i = 0; i < list.size(); i++) {
        int before = 0;
        int after = 0;
        String string = list.get(i);
        string = besserUmwandeln(string);
        System.out.println(string);
    }
}

public static String besserUmwandeln(String string) {
    string = string.replace("-", "");
    string = string.trim().replaceAll(("\\s+"), " ");
    string = string.replace(' ', '*');
    StringBuilder builder = new StringBuilder(string);
    System.out.println(string);
    for (int k = 0; k < builder.length(); k++) {
        if (Character.isUpperCase(builder.charAt(k))) {
            builder.setCharAt(k, ':');
        }
        if (Character.isLowerCase(builder.charAt(k))) {
            builder.setCharAt(k, '.');
        }
        if (Character.isDigit(builder.charAt(k))) {
        } else {
        }
    }
    for (int j = 0; j < builder.length(); j++) {
        if (j < builder.length() && builder.charAt(j) == ':' && builder.charAt(j + 1) == '.') {
            builder.deleteCharAt(j + 1);
        }
    }
    for (int i = 0; i < builder.length(); i++) {
        if (i < builder.length() - 1 && builder.charAt(i) == ':' && builder.charAt(i + 1) == ':') {
            builder.deleteCharAt(i);
        }
    }
    for (int i = 0; i < builder.length(); i++) {
        if (i < builder.length() - 1 && builder.charAt(i) == '+' && builder.charAt(i + 1) == '*') {
            builder.deleteCharAt(i + 1);
        }
    }
    for (int i = 0; i < builder.length(); i++) {
        if (i < builder.length() - 1 && builder.charAt(i) == '*' && builder.charAt(i + 1) == '+') {
            builder.deleteCharAt(i);
        }
    }
    for (int i = 0; i < builder.length(); i++) {
        if (i < builder.length() - 1 && builder.charAt(i) == '*' && builder.charAt(i + 1) == '>') {
            builder.deleteCharAt(i);
        }
    }
    for (int i = 0; i < builder.length(); i++) {
        if (i < builder.length() - 1 && builder.charAt(i) == '>' && builder.charAt(i + 1) == '*') {
            builder.deleteCharAt(i + 1);
        }
    }
    for (int i = 0; i < builder.length(); i++) {
        if (i < builder.length() - 1 && builder.charAt(i) == '*' && builder.charAt(i + 1) == ':') {
            builder.deleteCharAt(i + 1);
        }
    }


    return builder.toString();
}

问题答案:

因此,每次我需要解析一些文本时Java,我最终只会使用Regex。因此,我建议您也这样做。

您可以在regex101.com上测试正则表达式。

并且还可以轻松地用于Java

final inputText = ...
final Pattern pattern = Patern.compile("Some regex code");
final Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
    System.out.println(matcher.group(0));
}

在内部,Regex您可以使用(和定义捕获组,)然后通过捕获结果matcher.group(int)

例如,您可以先使用分隔方程式(.*) -> (.*)

使用左,右组,然后循环find使用:(\d+) (\w+)(?: \+| -|$)

之后,您可以使用group(1)金额和group(2)元素。

并且如果需要,还可以使用来迭代第二组(元素)以获取精确的元素分布(\w)(\d?)。然后,第一组是元素,例如,对于文本,CO2它产生两个匹配项,第一个匹配项group(1) -> C没有第二个匹配项。第二个命中有group(1) -> Ogroup(2) -> 2

在此处测试您的正则表达式:regex101#Q6KMJo



 类似资料:
  • 我想组成一个Reactor链,基本上可以做到以下几点: 验证提交的属性,例如,的长度或的有效性。我会使用下面的验证器。 验证提交的是否已被其他人使用。为此,我将使用反应性存储库。 保存,如果以上所有验证检查都通过。 用户: 反应性存储库: 验证器: 处理程序方法: 助手方法: 从被动的角度来看,我不确定如何实现这一目标。理想情况下,反应链将有3个步骤映射到上面的点。 这是我尝试过的,但我在方法参数

  • 问题内容: 我正在尝试从网站上抓取数据。该网站使用Facebook的React。因此,我可以使用Jaunt解析的源代码与使用Chrome的检查器检查元素时看到的代码完全不同。 我对这一切知之甚少,但是经过一些研究,我认为这与DOM而不是源代码有关。我需要一种方法来使用此DOM代码,因为原始源不包含任何我想要的内容,但我不知道从哪里开始(即使在这里已经阅读了很多答案)。 这是我要抓取的页面之一的示例

  • 我的Java应用程序“A”正在从另一个Java应用程序获取移动电话号码作为字符串。因此,在应用程序A获得手机号码字符串后,我需要验证该手机号码字符串中是否只有数字。为了验证我使用了如下的简单逻辑, 我正在检查I=1,因为国家代码的第一个字符将是“”。这种方法是O(n)。还有另一种方法,我们可以使用。这将抛出<代码> No.MultFrimeExtry,以便我们可以捕获并考虑它是一个字母数字字符串。

  • 我正在尝试使用 来为我的 react 应用程序的一小部分提供服务。我有两个部分(和),但我只对部分有顾虑。 我尝试了以下方法: > 在根目录下创建文件 我添加了来忽略babel,因为我无法使它导入文件,它不断抛出: 。 但是,每次我运行webpack时,它都会抛出诸如以下的错误: 位于这个根文件夹中。

  • 问题内容: 我有一个字符串,其内容是XML。我想将标签分开,并使其成为Java中的字符串列表。以下是我正在尝试的东西: 我想将其分为以下列表: 我试图通过JAXB处理器执行此操作,但效果不佳。还使用split尝试了一些愚蠢的逻辑,但这也无济于事。还有其他方法可以做到这一点吗? 问题答案:

  • 我是java和objectMapper的新手。我正在尝试解析json字段,该字段可能具有两种类型,它可能是字符串或数组。 例如: 或 类示例: 我使用objectMapper来反序列化json,当“full_name”字段有一个字符串时可以正常工作,但是当数组到达时,数组无法反序列化。 这个想法是,当到达一个字符串时,将值放在属性中,但当到达数组时,将数组元素连接为字符串(String.join