Java 嵌套For循环-使用数组对象分隔字符串元素

Java 嵌套For循环-使用数组对象分隔字符串元素,java,arrays,if-statement,for-loop,Java,Arrays,If Statement,For Loop,我有一个简单的问题,但最近它让我发疯。 我正在制作一个化学程序(更具体地说,是安卓应用程序),我有一个方法可以分离用户输入的元素。例如,如果某人在哪里输入“FeZnKPb”,它将被分为“Fe”、“Zn”、“K”和“Pb” 为此,我使用了一些嵌套的循环和变量来控制它。我已经在Chem[]数组中定义了所有元素。然后将分离的元素存储在名为savedChem[]的数组中。它基本上只是循环遍历所有元素常量(Chem[]),如果与输入匹配,则将这些元素的名称和公式复制到savedChem[]中 以下是我的代

我有一个简单的问题,但最近它让我发疯。 我正在制作一个化学程序(更具体地说,是安卓应用程序),我有一个方法可以分离用户输入的元素。例如,如果某人在哪里输入“FeZnKPb”,它将被分为“Fe”、“Zn”、“K”和“Pb”

为此,我使用了一些嵌套的循环和变量来控制它。我已经在Chem[]数组中定义了所有元素。然后将分离的元素存储在名为savedChem[]的数组中。它基本上只是循环遍历所有元素常量(Chem[]),如果与输入匹配,则将这些元素的名称和公式复制到savedChem[]中

以下是我的代码:

public void separateElements(String Input)
{
    boolean found = false;
    int start = 0;
    int end = 2;
    int length = Input.length();

    while(length >= end)
    {
        for(int x = 0; x < numChemicals; x++)
        {
            if((end + 0) > length)
            {
                end += 5;
                break;
            }
            if(Input.substring(start, end).equals(Chem[x].getFormula()))
            {
                savedChem[numSaved].setName(Chem[x].getName());
                savedChem[numSaved].setFormula(Chem[x].getFormula());
                numSaved++;
                start += 2;
                end += 2;
                found = true;
            }
            else
            {
                found = false;
            }
        }
        if(!found)
        {
            start += 2;
            end += 2;
        }
    }
}
公共void分隔元素(字符串输入)
{
布尔值=false;
int start=0;
int-end=2;
int length=Input.length();
while(长度>=结束)
{
对于(int x=0;x长度)
{
末端+=5;
打破
}
if(Input.substring(start,end).equals(Chem[x].getFormula())
{
savedChem[numSaved].setName(化学[x].getName());
savedChem[numSaved].setFormula(化学[x].getFormula());
numSaved++;
启动+=2;
end+=2;
发现=真;
}
其他的
{
发现=错误;
}
}
如果(!找到)
{
启动+=2;
end+=2;
}
}
}
我的问题是,它只适用于2字符元素,如“Fe”或“Zn”。我希望它也能识别像“K”这样的其他人。 另一个问题是,它有时会跳过一些其他元素。例如,如果我输入“FeZnHg”,它会将它们分为“Fe”、“Zn”和“Hg”。然而,如果我以不同的顺序输入它们,比如“ZnFeHg”,它只检测“Zn”和“Hg”,而不检测“Fe”

我还能用什么方法解决这个问题,使它正常工作

  • 不要预先定义结束,而是使结束<代码>开始+正在测试的化学名称的长度。因此,您可以比较
    Chem[x].getFormula().equals(Input.substring(start,start+Chem[x].getFormula().length())
    ,然后通过
    Chem[x].getFormula().length()前进
    start
    。我想您还需要验证
    start+Chem[x].getFormula().length()
    小于总长度,否则您将得到字符串索引越界异常
  • 当您找到一个化学名称匹配时,您需要从检查化学名称的内部循环中
    中断
    ,否则您将继续与后面的名称进行比较,并可能最终得到
    found=false
    。因此,您的底部
    if
    语句错误地前进了两个字符。例如,如果列表中
    Fe
    位于
    Zn
    之前,则在找到
    Zn
    之后,它将不会找到
    Fe
    ,并将跳过它

  • 假设元素总是一个大写字符和一个或两个小写字符(并且只有在一些非常短的元素中才有两个),您可以使用带有一些前瞻性的正则表达式将输入拆分为短字符串

    可以使用split方法和一些lookahead将字符串拆分为元素字符串。考虑到纳撒尼尔·福特的评论:

    public enum ChemicalElement {
        F, Fe, Zn, K, Pb, Umm, //and so on...
    }
    
    public List<ChemicalElement> separateElements(String input) {
        String[] inputParts = input.split("(?=[A-Z]{1,1}[a-z]{0,2})");
    
        List<ChemicalElement> elementList = new LinkedList<ChemicalElement>();
        for (int i = 1; i < inputParts.length; i++) {
            String inputPart = inputParts[i];
    
            // note: throws IllegalArgumentException for unknown elements
            ChemicalElement element = ChemicalElement.valueOf(inputPart);
            if (null != element) {
                elementList.add(element);
            }
    
        }
        return elementList;
    }
    
    公共枚举化学元素{
    F、 铁、锌、钾、铅、嗯……等等。。。
    }
    公共列表分隔元素(字符串输入){
    字符串[]inputParts=input.split((?=[A-Z]{1,1}[A-Z]{0,2})”;
    List elementList=新建LinkedList();
    for(int i=1;i
    这样的测试输入:

    String input = "FeZnKPbUmmK";
    List<ChemicalElement> elements = this.separateElements(input);
    
    String input=“FeZnKPbUmmK”;
    列表元素=此.separateElements(输入);
    
    将为您提供以下列表:


    [Fe,Zn,K,Pb,Umm,K]

    以下是我的拙劣建议……对于你们计划的未来,我想在你们有多个O原子的情况下也会更好。。。如果需要的话…我会做什么…我会创建一个所谓的2d矩阵(使用更多内存,但计算能力较低)26x26,其中每个索引对应一个字母…所以我们知道元素符号是唯一的,最多两个字母(我不确定那些实验性的…对不起:D)…然后您将逐个扫描字符串…假设您遇到F和e。。这会自动建议2d矩阵的索引…因此,如果索引已满(通过某些符号),您将查看该索引的内部然后你会将Fe添加到你的一般列表中…但假设在F之后你看到了一个K…然后当你查看矩阵时,你会看到它是空的,你会得出结论,它是氟…不管怎样,正如我所说的,更多的内存空间更少的计算…你的选择是否正确区分大小写是一个约束?也就是说,Mercury会一直是Hg吗,或者它会显示为Hg吗?您是否尝试过一步一步地调试您的代码?最好使用正则表达式。@NathanielFord是的,它总是这样。我有另一种方法来纠正这个问题。您可以始终执行以下操作:savedChem[]=separateElements(input).toArray(new-ChemicalElement[0]);如果要在使用返回某个值的方法时更新savedChem数组。(让separateElements方法返回一个值将使以后的测试更容易…)我同意这个解决方案,假设字符串是以大写字母分隔的。我还建议您将化学元素放入枚举中,并在其中封装比较代码,这样您的函数就可以返回一个
    Set
    ,而不是修改数组