枚举集合的无序对(2组合)

时间:2018-03-27 19:40:12

标签: java arraylist hashmap combinations combinatorics

我想迭代表示一组人员的ArrayList,并将每个Person的内容与其他Person进行比较。这种形式的内容充满了Hasmaps。我需要比较匹配键的值(键是唯一的)并获得整数的差异。这应该遍历所有的Hashmaps和Arraylist中的所有人。但我不应该比较p.e.人员A与人员C,然后人员C再次与人员A。

我该如何编码? 我在最近3个小时内挣扎。

public Integer comparison(){
   ArrayList<HashMap> personList = new ArrayList<>();

   for(int i = 0; i < personList.size(); i++){
      HashMap<String, Integer> persons = new HashMap<>();

      for(int j = i+1; j<persons.size(); j++){
         // sum up the differences
      }
      difference+=difference;
   }
   return difference;
}

2 个答案:

答案 0 :(得分:1)

数学中的这个主题使用所谓的Combinations,其中你需要找到一组的所有 k组合的集合(人A,B和C)。在这种情况下,获得所有组合很简单,因为你知道它总是只需要选择两个元素;也就是说, k = 2 。请参阅下面的外部循环和内部循环,以便轻松实现此目的:

    for(int a=0; a < personList.size()-1 /* stop before last */; a++) {
        for(int b=a+1 /* start after first */; b < personList.size(); b++) {
            int sumDiff = 0;
            System.out.print("person"+(char)('A'+a)+" compared with person"+(char)('A'+b)+" = ");
            Set<String> keys = personList.get(a).keySet();
            keys.retainAll(personList.get(b).keySet()); // keys in both only
            for(String key : keys) {
                sumDiff += Math.abs(personList.get(a).get(key)-personList.get(b).get(key));                 
            }
            System.out.println(sumDiff);
        }
    }

<强>输出:

  

personA与personB = 11相比

     

personA与personC = 8相比

     

personB与personC = 9相比

答案 1 :(得分:0)

首先,我们不清楚你想做什么。我假设您已获得personList并将其传递给您正在编写的函数。如果您希望将结果作为单个注释的列表,则需要将它们添加到列表中并返回List而不是Integer。

示例的以下代码应返回包含值{11,8,9}的List。如果你想要这些值的总和,比如11 + 8 + 9,那么不要将每个差异添加到列表中,而是将其添加到初始化为0的变量,并在1st for循环之外声明。

public List<Integer> comparison(ArrayList<HashMap> personList){
    List<Integer> result = new ArrayList<Integer>();
    //int res = 0;
    for(int i = 0; i < personList.size(); i++){
        for(int j=i+1; j< personList.size(); j++){
            int difference = 0
            for(Map.Entry<String, Object> entry : personList.get(i).entrySet()){
                String key = entry.getKey();
                int val = entry.getValue();
                difference += Math.abs(personList.get(j).get(key) - val);
            }
        }
        //res += difference
        result.add(difference);
   }
   //return res;
   return result;
}