这些本质上不应该是一样的吗?但只有当我使用大小变量并显式更改大小时,代码才会按预期运行。
以下内容未按预期运行:
public static ArrayList<String> removeDuplicates(ArrayList<String> miembres)
{
for(int i = 0; i < miembres.size() - 1; i++)
for(int j = i + 1; j < miembres.size(); j++)
if(miembres.get(i).equals(miembres.get(j)))
{
miembres.remove(j);
j--;
}
return miembres;
}
以下内容确实按预期运行:
public static ArrayList<String> removeDuplicates(ArrayList<String> miembres)
{
int size = miembres.size();
for(int i = 0; i < size - 1; i++)
for(int j = i + 1; j < size; j++)
if(miembres.get(i).equals(miembres.get(j)))
{
miembres.remove(j);
size--;
j--;
}
return miembres;
}
for 循环不应该自动考虑大小的变化吗?
在第一个片段中,您将
i
和 j
与 miembres.size()
进行比较,因此即使列表的大小减小,也不需要特殊处理 - 它将反映在对 size()
的调用中。
在第二个片段中,
size()
被调用一次并保存在一个局部变量中,该变量将不再受列表中更改的影响,因此当您从中删除一个项目时,您需要手动递减该变量(在此处完成)致电 size--
)。