获取列表中重复项的数量 - 输出错误

时间:2013-07-06 14:53:38

标签: java arraylist count duplicates

我需要在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

如何解决这个问题?

5 个答案:

答案 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)

我可以看到您当前代码的三个问题:

  1. 您没有比较元素对。您实际上是在将元素与索引进行比较。

  2. 你的内部循环是比较元素i和元素i ......这会导致错误的“重复”计数。

  3. 如果您的超过任何给定元素的2个副本,那么您将获得太多重复计数。 (要了解原因,请尝试使用(例如)三个相同元素的列表“手动执行”。

  4. 实际上,您必须使用辅助数据结构(例如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))