【发布时间】:2011-01-26 23:15:03
【问题描述】:
我正在开发一个使用ArrayList 存储Strings 的程序。该程序通过菜单提示用户并允许用户选择要执行的操作。此类操作是将字符串添加到列表、打印条目等。我想要做的是创建一个名为removeDuplicates() 的方法。此方法将搜索 ArrayList 并删除所有重复值。我想在列表中保留一个重复值的实例。我还希望此方法返回已删除的重复项总数。
我一直在尝试使用嵌套循环来完成此操作,但我遇到了麻烦,因为当条目被删除时,ArrayList 的索引会被更改,并且事情无法正常工作。我从概念上知道我需要做什么,但我无法在代码中实现这个想法。
这是一些伪代码:
从第一个条目开始; 检查列表中的每个后续条目,看看它是否与第一个条目匹配; 删除列表中与第一个条目匹配的每个后续条目;
检查完所有条目后,转到第二个条目; 检查列表中的每个条目,看看它是否与第二个条目匹配; 删除列表中与第二个条目匹配的每个条目;
重复进入列表
这是我目前的代码:
public int removeDuplicates()
{
int duplicates = 0;
for ( int i = 0; i < strings.size(); i++ )
{
for ( int j = 0; j < strings.size(); j++ )
{
if ( i == j )
{
// i & j refer to same entry so do nothing
}
else if ( strings.get( j ).equals( strings.get( i ) ) )
{
strings.remove( j );
duplicates++;
}
}
}
return duplicates;
}
更新:Will 似乎正在寻找一种家庭作业解决方案,该解决方案涉及开发用于删除重复项的算法,而不是使用 Sets 的实用解决方案。见他的评论:
感谢您的建议。这是作业的一部分,我相信老师的本意是不包括集合。换句话说,我要提出一个解决方案,在不实现HashSet 的情况下搜索和删除重复项。老师建议使用嵌套循环,这是我正在尝试做的,但在删除某些条目后,ArrayList 的索引出现了一些问题。
【问题讨论】:
-
如果无法通过 Set 运行它们(人们已经建议过),那么了解是否有任何其他限制会很有帮助,例如 O(?)。您当前的解决方案是 O(n^2),这在 CS 课程中很常见,被认为对于这样的事情来说太重了。
-
如果你的老师让你用 Java 做作业,那么用
Set给他那个务实的解决方案=)