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

Pkm*_*mte 2 java arrays for-loop if-statement

我有一个简单的问题,但它最近让我疯了.我正在制作化学课程(Android应用程序,更具体),我有一个方法可以分隔用户输入的元素.例如,如果有人在哪里输入"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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是它只适用于2个字符的元素,如"Fe"或"Zn".我希望它也能识别像"K"这样的其他人.另一个问题是它有时会跳过其他一些元素.例如,如果我输入"FeZnHg",它会将它们分成"Fe","Zn"和"Hg".但是,如果我以不同的顺序输入它们,如"ZnFeHg",它只会因某种原因检测到"Zn"和"Hg"而不是"Fe".

还有哪些其他方法可以解决这个问题才能让它正常工作?

Mas*_*ant 5

鉴于元素总是大写字符和一个或两个小写字符(仅在一些非常短暂的元素的情况下两个),你可以使用带有一些预测的正则表达式将输入分成短字符串.

您可以使用split方法和一些前瞻将字符串拆分为元素字符串.将纳撒尼尔·福特的评论考虑在内:

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;
}
Run Code Online (Sandbox Code Playgroud)

所以像这样的测试输入:

String input = "FeZnKPbUmmK";
List<ChemicalElement> elements = this.separateElements(input);
Run Code Online (Sandbox Code Playgroud)

会给你以下清单:

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