gpt4 book ai didi

Java:解析字符串并将其分解为 'terms'

转载 作者:行者123 更新时间:2023-11-30 08:03:10 28 4
gpt4 key购买 nike

我在一个围绕化学式的项目上遇到了麻烦。我有两个类(class),Term 和 Formula。

Term 接收诸如“H”或“C2”之类的输入 - 只有一个字母和任意数量的后续数字。它的字段是 element 和 atoms - element 存储元素的字符,'H' 或 'C',atoms 存储原子数的 int 值,1 或 2。

我是这样写构造函数的;

public Term(String s)
{

if(s.length() == 1){
element = s.charAt(0);
atoms = 1; }

else {
element = s.charAt(0);
String sA = s.substring(1,s.length());
atoms = Integer.parseInt(sA);
}
}

我明白了。我的问题出在公式类中,它接收像“CH3CH2CH2CH2CH2CH3”这样的字符串。它涉及一个 ArrayList,它存储称为术语的术语对象。我需要编写一个可以接收公式的构造函数,例如“CH2O”,并给出术语 {Term('C',1),Term('H',2),Term('O',1)} 等。

我真的很难弄清楚如何让构造函数识别输入字符串中的术语 - 我考虑过 valueOf 和 indexOf,或者可能是子字符串,但似乎无法理解。我的第一次尝试是;

 terms = new ArrayList<>();
for(int i = 0; i <= s.length();i++)
{
if ((Character.isUpperCase(s.charAt(i))) && (Character.isUpperCase(s.charAt(i+1)))
{ Term formulaS = new Term(s.charAt(i));
terms.add(formulaS); }

我理解这是非常错误的,它只识别只有一个字符但没有原子数的术语,例如“H”。我觉得答案涉及 for 循环。对于帖子的长度,我深表歉意,但我们将不胜感激。

最佳答案

这看起来像是使用 java.util.Pattern 进行正则表达式解析的工作和 java.util.Matcher .特别是,您需要让正则表达式指定组,这样您就可以通过 group() 将每个 Term 作为一个组访问。 Matcher 上的方法。

这是解析输入分子并实例化 Term 对象的代码。我用 @AJNeufeld 的一些非常有用的建议从原作中充实了它.

public class MoleculeParser {
private static final Pattern PATTERN = Pattern.compile ("([A-Z][a-z]?)(\\d*)");

public static List<Term> parseMolecule (String molecule) {
List<Term> terms = new ArrayList<> ();

Matcher matcher = PATTERN.matcher (molecule);
while (matcher.find()) {
String element = matcher.group(1);
String group2 = matcher.group(2);
if (!group2.isEmpty ()) {
int atoms = Integer.parseInt (matcher.group(2));
terms.add(new Term(element, atoms));
}
else {
terms.add(new Term(element));
}
}

return terms;
}

public static void main (String[] args) {
String str = "CH3CH2CH2CH2CH2CH3";
System.out.println (parseMolecule (str));

str = "C12H22O11 ";
System.out.println (parseMolecule (str));

str = "SiCl4";
System.out.println (parseMolecule (str));
}
}


public class Term {
public Term (String element) {
this(element, 1);
}

public Term (String element, int atoms) {
_element = element;
_atoms = atoms;
}

@Override
public String toString () {
return _element + (_atoms != 1 ? _atoms : "") ;
}

private String _element;
private int _atoms;
}

此代码利用正则表达式组的强大功能,不仅可以解决您眼前的问题,还可以处理您在 Term 中进行的解析,还支持周期符号中包含两个字符的原子.

正则表达式“组”是正则表达式匹配的一部分,然后您可以通过索引引用它。因此,正则表达式不仅可以用于测试完整的输入表达式是否匹配,还可以用于解析匹配的输入表达式并将其分解为与正则表达式本身的片段匹配的片段——即组。您使用括号在正则表达式中定义组 - 请务必查看我在本文底部提到的所有教程链接,以便您完全理解这一点。

在上面的代码中,正则表达式 Matcher 遍历您的输入。它使用 find() 遇到的每个 block 都与正则表达式中指定的一组组相匹配。组 0 始终是组的整个匹配集,组 1 是第一组,组 2 是第二组。由于第二组(原子)是可选的,我们测试它是否为空。另请注意,Pattern 编译应该只发生一次,因此它被实例化为一个 static final 常量。

这里的主要内容是我们已经将所有解析从 Term 中提取出来,并将所有内容集中在这个解析例程中。为了支持这一点,我为您重写了 Term 构造函数。

理解正则表达式对于任何类型的解析都是必不可少的。我推荐the Oracle tutorial一个很好的基于 Java 的介绍。特别是,确保您了解 the section on groups ,因为这就是我们上面用来分解你的分子的东西。

正如@AJNeufeld 在评论中指出的那样,我的解决方案将不支持更复杂的分子,例如 Al2(SO4)3。了解此代码和引用的教程后,您应该能够对其进行修改以支持此类输入。

关于Java:解析字符串并将其分解为 'terms',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36407757/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com