为什么我的 if-else-if 语句在我的数组列表中不起作用?
Why is my if-else-if statement not working in my arraylist?
以下是我的代码。当我编译它时,程序 works.But 给了我错误的输出。当我使用循环打印出 arrayList 的元素时,它打印出错误的输出。例如,"Greenville, SC" 被打印出来,而它应该被排除在第一个 if- 语句中。
arraylist 具有重复的值。
for (int i = 0; i < NoUber_cities.size(); i++)
{
if ((NoUber_cities.get(i)).equalsIgnoreCase("Greenville, SC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Pensacola, FL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Peoria, IL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Asheville, NC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Hattiesburg, MS"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Portland, ME"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Portland, ME"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Huntsville, AL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Reading, PA"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Birmingham, AL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Bloomington, IN"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Bowling Green, KY"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Lafayette, LA"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Central Atlantic Coast, FL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Lancaster, PA"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Charleston, SC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Charleston, WV"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("San Juan, PR"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("London, Ont"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Springfield, IL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Columbia, MO"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Columbia, SC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Montgomery, AL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Morgantown, WV"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Fayetteville, AR"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Wilmington, NC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Outer Banks, NC"))
{
NoUber_cities.remove(i);
}
}
您的代码存在的问题是,一旦您从列表中删除一个项目,所有剩余的项目都会更改索引,但您的代码没有考虑到这一点。
例如,假设您的列表包含:
0 - AAA
1 - BBB
2 - CCC
3 - DDD
如果 i
= 1 并且您决定删除 BBB,则列表现在如下所示:
0 - AAA
1 - CCC
2 - DDD
但是您的循环然后递增 i
并继续检查 - 现在 i
= 2 并且您错过了移入索引 1 的 CCC 项目。
有多种方法可以解决这个问题。一种方法是在删除项目时递减索引:
for (int i = 0; i < NoUber_cities.size(); i++)
{
if ((NoUber_cities.get(i)).equalsIgnoreCase("Greenville, SC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Pensacola, FL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Peoria, IL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Asheville, NC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Hattiesburg, MS")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Portland, ME")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Portland, ME")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Huntsville, AL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Reading, PA")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Birmingham, AL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Bloomington, IN")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Bowling Green, KY")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Lafayette, LA")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Central Atlantic Coast, FL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Lancaster, PA")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Charleston, SC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Charleston, WV")
|| (NoUber_cities.get(i)).equalsIgnoreCase("San Juan, PR")
|| (NoUber_cities.get(i)).equalsIgnoreCase("London, Ont")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Springfield, IL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Columbia, MO")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Columbia, SC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Montgomery, AL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Morgantown, WV")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Fayetteville, AR")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Wilmington, NC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Outer Banks, NC"))
{
NoUber_cities.remove(i);
i--;
}
}
另一种方法是在 Java 8:
中使用流
List<String> citiesToRemove = Arrays.asList(
"greenville, sc",
"pensacola, fl",
"peoria, il",
"asheville, nc",
"hattiesburg, ms",
"portland, me",
"huntsville, al",
"reading, pa",
"birmingham, al",
"bloomington, in",
"bowling green, ky",
"lafayette, la",
"central atlantic coast, fl",
"lancaster, pa",
"charleston, sc",
"charleston, wv",
"san juan, pr",
"london, ont",
"springfield, il",
"columbia, mo",
"columbia, sc",
"montgomery, al",
"morgantown, wv",
"fayetteville, ar",
"wilmington, nc",
"outer banks,nc");
List<String> filteredListOfCities = NoUber_cities.stream()
.filter(item -> !citiesToRemove.contains(item.toLowerCase()))
.collect(Collectors.toList());
向后工作:
for (int i = NoUber_cities.size() - 1; i >= 0; i--)
这样前面的项目的索引就不会移动,您可以毫无问题地删除索引 i
处的项目。最好从索引集合中向后删除项目。
说明
假设你有一个列表
0: AAA
1: BBB
2: CCC
3: DDD
4: EEE
5: FFF
6: GGG
如果删除索引 3 处的 DDD
,则列表将如下所示:
0: AAA
1: BBB
2: CCC
3: EEE
4: FFF
5: GGG
如您所见,具有更高索引的项目将向下移动并获得新索引。 较低 索引处的项目将保持不变。
现在,如果迭代forward,当前索引为3,那么下一个索引为4,删除后指向FFF
。这意味着您从未检查过 EEE
.
OTOH,如果你向后迭代,下一个索引是 2,它仍然包含 CCC
。 (请注意,您已经检查了较高的索引,因此这些索引是否获得新索引并不重要)。数组大小发生变化,但比删除点低索引的项的索引不变。
您在删除原始元素后正在跳过列表中的元素;因为元素在删除原始元素后向上移动。
您可以考虑使用 iterator
以及其他给定答案的替代方案:
List<String> citiesToRemove = new ArrayList<String>();
citiesToRemove.add("greenville, sc");
citiesToRemove.add("pensacola, fl");
citiesToRemove.add("peoria, il");
citiesToRemove.add("greenville, sc");
citiesToRemove.add("asheville, nc");
citiesToRemove.add("greenville, sc"); --Duplicate element
System.out.println(citiesToRemove);
Iterator<String> itr = citiesToRemove.iterator();
while (itr.hasNext())
if (itr.next().equalsIgnoreCase("greenville, sc")||
itr.next().equalsIgnoreCase("peoria, il"))
itr.remove();
System.out.println(citiesToRemove);
以下是我的代码。当我编译它时,程序 works.But 给了我错误的输出。当我使用循环打印出 arrayList 的元素时,它打印出错误的输出。例如,"Greenville, SC" 被打印出来,而它应该被排除在第一个 if- 语句中。 arraylist 具有重复的值。
for (int i = 0; i < NoUber_cities.size(); i++)
{
if ((NoUber_cities.get(i)).equalsIgnoreCase("Greenville, SC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Pensacola, FL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Peoria, IL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Asheville, NC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Hattiesburg, MS"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Portland, ME"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Portland, ME"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Huntsville, AL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Reading, PA"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Birmingham, AL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Bloomington, IN"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Bowling Green, KY"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Lafayette, LA"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Central Atlantic Coast, FL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Lancaster, PA"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Charleston, SC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Charleston, WV"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("San Juan, PR"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("London, Ont"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Springfield, IL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Columbia, MO"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Columbia, SC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Montgomery, AL"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Morgantown, WV"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Fayetteville, AR"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Wilmington, NC"))
{
NoUber_cities.remove(i);
}
else if ((NoUber_cities.get(i)).equalsIgnoreCase("Outer Banks, NC"))
{
NoUber_cities.remove(i);
}
}
您的代码存在的问题是,一旦您从列表中删除一个项目,所有剩余的项目都会更改索引,但您的代码没有考虑到这一点。
例如,假设您的列表包含:
0 - AAA
1 - BBB
2 - CCC
3 - DDD
如果 i
= 1 并且您决定删除 BBB,则列表现在如下所示:
0 - AAA
1 - CCC
2 - DDD
但是您的循环然后递增 i
并继续检查 - 现在 i
= 2 并且您错过了移入索引 1 的 CCC 项目。
有多种方法可以解决这个问题。一种方法是在删除项目时递减索引:
for (int i = 0; i < NoUber_cities.size(); i++)
{
if ((NoUber_cities.get(i)).equalsIgnoreCase("Greenville, SC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Pensacola, FL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Peoria, IL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Asheville, NC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Hattiesburg, MS")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Portland, ME")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Portland, ME")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Huntsville, AL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Reading, PA")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Birmingham, AL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Bloomington, IN")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Bowling Green, KY")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Lafayette, LA")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Central Atlantic Coast, FL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Lancaster, PA")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Charleston, SC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Charleston, WV")
|| (NoUber_cities.get(i)).equalsIgnoreCase("San Juan, PR")
|| (NoUber_cities.get(i)).equalsIgnoreCase("London, Ont")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Springfield, IL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Columbia, MO")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Columbia, SC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Montgomery, AL")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Morgantown, WV")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Fayetteville, AR")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Wilmington, NC")
|| (NoUber_cities.get(i)).equalsIgnoreCase("Outer Banks, NC"))
{
NoUber_cities.remove(i);
i--;
}
}
另一种方法是在 Java 8:
中使用流List<String> citiesToRemove = Arrays.asList(
"greenville, sc",
"pensacola, fl",
"peoria, il",
"asheville, nc",
"hattiesburg, ms",
"portland, me",
"huntsville, al",
"reading, pa",
"birmingham, al",
"bloomington, in",
"bowling green, ky",
"lafayette, la",
"central atlantic coast, fl",
"lancaster, pa",
"charleston, sc",
"charleston, wv",
"san juan, pr",
"london, ont",
"springfield, il",
"columbia, mo",
"columbia, sc",
"montgomery, al",
"morgantown, wv",
"fayetteville, ar",
"wilmington, nc",
"outer banks,nc");
List<String> filteredListOfCities = NoUber_cities.stream()
.filter(item -> !citiesToRemove.contains(item.toLowerCase()))
.collect(Collectors.toList());
向后工作:
for (int i = NoUber_cities.size() - 1; i >= 0; i--)
这样前面的项目的索引就不会移动,您可以毫无问题地删除索引 i
处的项目。最好从索引集合中向后删除项目。
说明
假设你有一个列表
0: AAA
1: BBB
2: CCC
3: DDD
4: EEE
5: FFF
6: GGG
如果删除索引 3 处的 DDD
,则列表将如下所示:
0: AAA
1: BBB
2: CCC
3: EEE
4: FFF
5: GGG
如您所见,具有更高索引的项目将向下移动并获得新索引。 较低 索引处的项目将保持不变。
现在,如果迭代forward,当前索引为3,那么下一个索引为4,删除后指向FFF
。这意味着您从未检查过 EEE
.
OTOH,如果你向后迭代,下一个索引是 2,它仍然包含 CCC
。 (请注意,您已经检查了较高的索引,因此这些索引是否获得新索引并不重要)。数组大小发生变化,但比删除点低索引的项的索引不变。
您在删除原始元素后正在跳过列表中的元素;因为元素在删除原始元素后向上移动。
您可以考虑使用 iterator
以及其他给定答案的替代方案:
List<String> citiesToRemove = new ArrayList<String>();
citiesToRemove.add("greenville, sc");
citiesToRemove.add("pensacola, fl");
citiesToRemove.add("peoria, il");
citiesToRemove.add("greenville, sc");
citiesToRemove.add("asheville, nc");
citiesToRemove.add("greenville, sc"); --Duplicate element
System.out.println(citiesToRemove);
Iterator<String> itr = citiesToRemove.iterator();
while (itr.hasNext())
if (itr.next().equalsIgnoreCase("greenville, sc")||
itr.next().equalsIgnoreCase("peoria, il"))
itr.remove();
System.out.println(citiesToRemove);