我想迭代表示一组人员的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;
}
答案 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;
}