-4

如何计算重复项ArrayList并只计算一次。

这是我到目前为止所拥有的:

  /**
   * 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

我错过了一些非常容易的事情。但是,找不到它到底是什么。

如何解决这个麻烦?

4

5 回答 5

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;
  }
于 2013-07-06T14:56:18.750 回答
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;
 }
于 2013-07-06T14:56:54.633 回答
1

为此使用两组:

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'才返回 true。.add()请注意,它只遍历列表一次。

于 2013-07-06T14:57:59.740 回答
1

您正在比较索引j值而不是 list 的值list.get(j)

if (list.get(i).equals(list.get(j))) 

而不是 if (list.get(i).equals(j))

于 2013-07-06T15:03:20.417 回答
1

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

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

  2. 您的内部循环正在比较元素 i 和元素 i ...,这将导致错误的“重复”计数。

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

事实上,您必须要么使用辅助数据结构(例如 2 Sets 或 Map),要么修改输入列表以避免重复计算多次。


我会注意到你对问题的陈述是模棱两可的。“...只计算每个重复一次”可能意味着 '[1, 1, 1]' 给出 1 或 2。这取决于您是否认为每个人1都是重复计算一次,或者我们将其1视为其中之一一组重复......只能计算一次。

于 2013-07-06T15:17:51.470 回答