Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java ArrayList中查找重复项对_Java_Algorithm_Math - Fatal编程技术网

在Java ArrayList中查找重复项对

在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个组合

我正在查找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个组合()

所以基本上你需要一个方法来计算
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
    ?是的,我应该这样做!编辑,谢谢:)