在Java ArrayList中查找重复项对
我正在查找Java ArrayList中重复对的数量 我可以在纸上计算出来,但我不知道是否有某种形式的数学公式可以轻松地计算出来,因为我试图在代码中避免嵌套for循环 使用数据集[2,2,3,2,2]的示例:在Java ArrayList中查找重复项对,java,algorithm,math,Java,Algorithm,Math,我正在查找Java ArrayList中重复对的数量 我可以在纸上计算出来,但我不知道是否有某种形式的数学公式可以轻松地计算出来,因为我试图在代码中避免嵌套for循环 使用数据集[2,2,3,2,2]的示例: 0:1, 0:3, 0:4, 1:3, 1:4, 3:4. 所以答案是六对重复的数字?首先对数字进行排序。稍后,如果给定数字有k个副本,则该数字将有k*(k-1)/2对。现在对所有数字求和。您只需计算每个数字出现的次数(我将在这里使用一个映射),然后计算计数大于1的每个数字的计数的2个组合
0:1, 0:3, 0:4, 1:3, 1:4, 3:4. 所以答案是六对重复的数字?首先对数字进行排序。稍后,如果给定数字有
k
个副本,则该数字将有k*(k-1)/2对。现在对所有数字求和。您只需计算每个数字出现的次数(我将在这里使用一个映射),然后计算计数大于1的每个数字的计数的2个组合()
所以基本上你需要一个方法来计算n/K(n-k)
其中k
为2,n
为计数
以您的示例[2,2,3,2,2]为例,数字2出现4次,因此数学结果如下:
四!/2.(4-2)! = 24/4=6-->6对
如果您不想实现阶乘函数,可以使用Apache Commons中的算术utils,它们已经有了。如果您想避免嵌套循环(以牺牲两个循环为代价),可以:
对于列表中的每个数字,找出每个数字重复的次数(可以使用键=数字、值=列表中出现该数字的次数的映射)
对于图中的每个数字,根据其出现的次数计算可能的组合数(0或1次=无重复对,2或更多=n!/(2*(n-2)!)=(n*(n-1))/2个重复对)
对所有可能的组合求和
执行ElKamina建议的排序将允许对该方法进行一些优化。如果元素是字符串,则使用:
Multiset<String> multiset = HashMultiset.create(list);
int pairs = 0;
for(Multiset.Entry<String> entry : multiset.entrySet()) {
pairs += IntMath.binomial(entry.getCount(), 2);
}
return pairs;
Multiset Multiset=HashMultiset.create(列表);
整数对=0;
for(Multiset.Entry:Multiset.entrySet()){
pairs+=IntMath.二项式(entry.getCount(),2);
}
返回对;
这使用了番石榴和实用程序。数字的顺序重要吗?不,我想不重要,因为我实际上是想根据碰撞对的数量来执行功能。你是否应该在重复对中包含3:4
?是的,我应该这样做!编辑,谢谢:)