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