如何将一个哈希图中的值与另一个哈希图中的相同值进行比较?

How do i compare a value in one hashmap to the same value in another hashmap?

早上好,

抱歉,如果有人问过这个问题,但我被困在我正在构建的 java 项目上。

该程序允许用户下注(例如体育比赛的预测结果),稍后允许用户插入所述比赛的最终结果。

这是由 2 个 LinkedHashMap 完成的。一个具有用户和预测分数的键值对,以及一个用户和最终分数。

两个 LinkedHashMap 中键的顺序将与它们从另一个包含用户名称的数组中获取键输入的顺序相同。因此,每次只设置预测分数和最终分数。 (通过使用用户名称在数组上调用 .get 来设置密钥)。

我想做的是将 LinkedHashMap 中的值与预测分数与 LinkedHashMap 中的值与最终分数进行比较。然而,这需要按键值对进行比较。所以我不能只检查两个 LinkedHashMap 的相等性。例如,有四个用户,只有一个可以预测正确的分数。如果我检查两个 LinkedHashMap 与另一个的相等性,它会检查整个键值对。我需要为每个键值对获取一个布尔结果。

我想检查值的索引位置是否相等,但这不是 LinkedHashMaps 的工作方式。 LinkedHashMap 键和 LinkedHashMap 值都是自定义对象(键是 class 的一个实例,里面有一个设置的字符串,值是一个枚举)。

我该怎么做?

我目前正在考虑首先在每个“索引”位置的两个 LinedHashMap 上调用 .toArray 并检查该位置与设定数量的相等性.. 像这样; (voorspellingen 是 LinkedHashMap 1,uitslagen 是另一个 LinkedHashMap)

voorspellingen.keySet().toArray()[0])
uitslagen.keySet().toArray()[0])
if (etc.)

但我不确定这是否是最 "effective" 的方式...

我建议只使用一个 HashMap,对于值,使用一个包含两个结果的对象。

class Results
{
    int res1;
    int res2;
}

使用上面的class作为你的值class,这样你只需要遍历一次HashMap来比较对象中的两个结果是否相等。

有很多方法可以做到这一点,但最清晰的可能是迭代一个映射的键集:

    var voorspellingen = new LinkedHashMap<String, Integer>(); //ex: <user name, predicted score difference>
    var uitslagen = new LinkedHashMap<String, Integer>();

    //... add data to maps here

    //Let's get a list of the users that gave good predictions
    Predicate<String> correctPrediction = name -> (uitslagen.get(name) != null 
                                                && uitslagen.get(name).equals(voorspellingen.get(name)));
    List<String> correctUsers = uitslagen.keySet().stream()
                                        .filter(correctPrediction)
                                        .collect(Collectors.toList());

请注意,此解决方案不一定是最快的。我不知道你为什么选择 LinkedHashMap,但如果你有数百万用户,那么将预测和结果分组在同一个对象中可能确实更好。

我会用对象形式的值放入一张地图而不是两张地图。但是这里的权衡是我们将失去输入的确定值的顺序。

import java.util.LinkedHashMap;

public class CompareTwoBets {

    public static void main(String[] args) {
        LinkedHashMap<String, Bet> map = new LinkedHashMap<>();
        // First the users add prediction
        map.put("jack", new Bet(1));
        map.put("Bronwen", new Bet(2));
        map.put("Cyrus", new Bet(2));
        map.put("Brent", new Bet(5));

        // now the users key in the definitive value
        Bet bet = map.get("jack");
        bet.setDefinitive(5);
        map.put("jack", bet);

        bet = map.get("Bronwen");
        bet.setDefinitive(5);
        map.put("Bronwen", bet);

        bet = map.get("Cyrus");
        bet.setDefinitive(5);
        map.put("Cyrus", bet);

        bet = map.get("Brent");
        bet.setDefinitive(5);
        map.put("Brent", bet);
        System.out.println(map);

        // process to know who put the bet accurately

        map.forEach((user, x) -> {
            if(x.definitive == x.predicted) {
                System.out.println("User  " + user +" predicted accurately." );
            }
            else {
                System.out.println("User  " + user +" predicted wrongly." );
            }
        });

    }

}

public class User{
    String firstName;
    String lastName;
    public User(String firstName, String lastName){
        this.firstName = firstName;
        this.lastName = lastName;
    }   
}

public class Bet {

    int predicted;
    int definitive;

    public Bet(int predicted) {
        this.predicted = predicted;
    }

    public void setDefinitive(int definitive) {
        this.definitive = definitive;
    }
}