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".
还有哪些其他方法可以解决这个问题才能让它正常工作?
鉴于元素总是大写字符和一个或两个小写字符(仅在一些非常短暂的元素的情况下两个),你可以使用带有一些预测的正则表达式将输入分成短字符串.
您可以使用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]