我需要在ArrayList中计算重复数,但只计算每个重复一次。从索引0开始。
代码:
/**
* Gets the number of duplicates in the list.
* Get the next word. It is at index i. Does it match any of the words with index > i?)
* @return the number of duplicate words in the list
*/
public int countDuplicates()
{
int duplicates = 0;
for (int i = 0; i < list.size(); i++) {
for (int j = i; j < list.size(); j++) {
if (list.get(i).equals(j)) duplicates++;
}
}
return duplicates;
}
我的实施无法正常运作 我无法弄明白为什么。
Actual: 0
Expected: 3
如何解决这个问题?
答案 0 :(得分:2)
您没有直接与j
比较的第j个元素。正如评论者指出的那样,j
应该从i+1
开始,以避免将元素与自身进行比较。因此,您需要编写
public int countDuplicates()
{
int duplicates = 0;
for (int i = 0; i < list.size(); i++) {
for (int j = i+1; j < list.size(); j++) {
if (list.get(i).equals(list.get(j))) duplicates++;
}
}
return duplicates;
}
答案 1 :(得分:1)
应该是:
public int countDuplicates()
{
int duplicates = 0;
// TODO: Write the code to get the number of duplicates in the list
for (int i = 0; i < list.size(); i++) {
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i).equals(list.get(j))) duplicates++;
}
}
return duplicates;
}
答案 2 :(得分:1)
我可以看到您当前代码的三个问题:
您没有比较元素对。您实际上是在将元素与索引进行比较。
你的内部循环是比较元素i和元素i ......这会导致错误的“重复”计数。
如果您的超过任何给定元素的2个副本,那么您将获得太多重复计数。 (要了解原因,请尝试使用(例如)三个相同元素的列表“手动执行”。
实际上,您必须使用辅助数据结构(例如2套或地图)或修改输入列表以避免重复计算重复次数。
我会注意到你对这个问题的陈述含糊不清。 “......只计算每个重复一次”可能意味着'[1,1,1]'给出1或2.这取决于您是否认为每个人1
是重复计数一次或那个我们将1
作为一组重复项之一......只能计算一次。
答案 3 :(得分:0)
为此使用两套:
final Set<X> set = new HashSet<>();
final Set<X> dups = new HashSet<>();
int dupCount = 0;
for (final X x: list) {
if (set.add(x)) // first time the element is seen
continue;
// Dup; see whether it is the first time we see it
if (dups.add(x))
dupCount++;
}
return dupCount;
这取决于Set
的{{1}}当且仅当该集合作为操作结果被修改时返回true的事实。请注意,它只遍历列表一次。
答案 4 :(得分:0)
您正在比较索引j
值而不是列表list.get(j)
的值。
待办事项
if (list.get(i).equals(list.get(j)))
而不是
if (list.get(i).equals(j
))