【问题标题】:How do i compare a value in one hashmap to the same value in another hashmap?如何将一个哈希图中的值与另一个哈希图中的相同值进行比较?
【发布时间】:2019-03-26 05:17:51
【问题描述】:

早上好,

很抱歉,如果这已经被问过了,但我被困在我正在构建的 java 项目上。

这是一个允许用户插入投注(例如体育比赛的预测结果)并在稍后允许用户插入所述比赛的最终结果的程序。

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

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

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

我想过检查值的索引位置的相等性,但这不是 LinkedHashMaps 的工作方式。 LinkedHashMap 键和 LinkedHashMap 值都是自定义对象(键是一个类的实例,其中包含一个集合字符串,值是一个枚举)。

我该怎么做呢?

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

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

但我不确定这是否是最“有效”的方式......

【问题讨论】:

  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已在 CC BY-SA 3.0 license 下授予 SE 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 SE 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work? ...

标签: java hashmap linkedhashmap


【解决方案1】:

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

class Results
{
    int res1;
    int res2;
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-24
        • 1970-01-01
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        • 2020-02-20
        相关资源
        最近更新 更多