在Java ArrayList中查找重复对

时间:2012-03-16 01:09:17

标签: java algorithm math

我希望在Java ArrayList中找到重复的的数量。

我可以在纸上解决这个问题,但我不知道是否有某种形式的数学公式可以轻松解决这个问题,因为我试图在代码中避免使用嵌套for循环。

使用数据集[2,2,3,2,2]的示例: 0:1,0:3,0:4,1:3,1:4,3:4。所以答案是六对重复?

4 个答案:

答案 0 :(得分:4)

你只需要计算每个数字出现的次数(我会在这里使用地图)并计算每个数字的计数的2个组合(http://en.wikipedia.org/wiki/Combination),并且计数> 1。

所以基本上你需要一种方法来计算n!/k!(n-k)!k为2,n为计数。

以你的例子[2,2,3,2,2]为例,数字2出现了4次,所以算数将会出现:

4!/ 2!(4-2)! = 24/4 = 6 - > 6对

如果您不想实现阶乘函数,可以使用Apache Commons的ArithmeticUtils,它们已经有factorial implemented

答案 1 :(得分:2)

如果你想避免嵌套循环(以2个循环为代价),你可以:

  1. 对于列表中的每个数字,查找每个数字重复的次数(可能使用带键的地图=数字,值=列表中出现的数字的次数)
  2. 对于地图中的每个数字,根据发生的时间计算可能的组合数(0或1次=无重复对,2或更多= n!/(2 *(n-2)!) =(n *(n-1))/ 2个重复对)
  3. 总结所有可能的组合
  4. 像ElKamina这样做的建议可以对这种方法进行一些优化。

答案 2 :(得分:0)

先排序数字。之后,如果存在给定数字的k个副本,则该数字将有k*(k-1)/2个对。现在总结所有数字。

答案 3 :(得分:0)

使用Guava,如果您的元素为String s:

Multiset<String> multiset = HashMultiset.create(list);
int pairs = 0;
for(Multiset.Entry<String> entry : multiset.entrySet()) {
  pairs += IntMath.binomial(entry.getCount(), 2);
}
return pairs;

使用Guava的Multisetmath实用程序。