为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

月关宝盒 2021-12-01 15:46:09
早上好,对不起,如果已经有人问过这个问题,但我被困在我正在构建的 Java 项目上。它是一个程序,允许用户插入赌注(例如体育比赛的预测结果),然后允许用户插入所述比赛的最终结果。这是由 2 个 LinkedHashMap 完成的。一个具有用户和预测分数的键值对以及用户和确定分数之一。两个 LinkedHashMap 中键的顺序将与它们从另一个具有用户姓名的 Array 中获取键的输入相同。因此,每次都只设置预测的和最终的分数。(通过在具有用户名称的数组上调用 .get 来设置密钥)。我想要做的是将 LinkedHashMap 中的值与预测分数进行比较,并将 LinkedHashMap 中的值与最终分数进行比较。然而,这需要按键值对进行比较。所以我不能只检查两个 LinkedHashMaps 的相等性。例如,对于四个用户,只有一个用户可以预测正确的分数。如果我检查两个 LinkedHashMap 与另一个的相等性,它会检查整个键值对。我需要为每个键值对获得一个布尔结果。我想检查值的索引位置是否相等,但这不是 LinkedHashMaps 的工作方式。LinkedHashMap Key 和 LinkedHashMap 值都是自定义对象(键是一个类的实例,其中有一个设置字符串,值是一个枚举)。我该怎么做呢?我目前正在考虑首先在每个“索引”位置的 LinedHashMap 上调用 .toArray 并检查该位置与设定数量的相等性..像这样;(voorspellingen 是 LinkedHashMap 1,uitslagen 是另一个 LinkedHashMap)voorspellingen.keySet().toArray()[0])uitslagen.keySet().toArray()[0])if (etc.)但我不确定这是否是最“有效”的方式......
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

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

    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,但如果你有数百万用户,将预测和结果分组在同一个对象中确实可能更好。


查看完整回答
反对 回复 2021-12-01
?
精慕HU

TA贡献1845条经验 获得超8个赞

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


class Results

{

    int res1;

    int res2;

}

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


查看完整回答
反对 回复 2021-12-01
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

我会用对象形式的值放入一张地图而不是两张地图。但是这里的权衡是我们将失去进入的最终值的序列。


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;

    }

}


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信