早上好
很抱歉,是否已经有人问过我,但是我被困在正在构建的Java项目中。
它是一个程序,允许用户插入一个赌注(例如体育比赛的预测结果),并在以后允许用户插入所述比赛的确定结果。
这由2个LinkedHashMaps完成。一个具有用户和预测分数的键值对,一个具有用户和确定分数的键值。
两个LinkedHashMap中的键顺序与从另一个具有用户名的Array获取键输入的顺序相同。因此,每次只会设置预测分数和确定分数。 (通过使用用户名在数组上调用.get来设置密钥。
我想做的是将LinkedHashMap中具有预测分数的值与LinkedHashMap中具有确定分数的值进行比较。但是,需要对每个键值对进行比较。所以我不能只检查两个LinkedHashMaps是否相等。例如,对于四个用户,只有一个可以预测正确的分数。如果我检查两个LinkedHashMap与另一个的相等性,则会整体检查键值对。我需要每个键值对获得一个布尔值结果。
我想到了检查值的索引位置是否相等,但是这不是LinkedHashMaps如何工作的。 LinkedHashMap键和LinkedHashMap值都是自定义对象(键是其中带有设置字符串的类的实例,该值是枚举)。
我将如何去做?
我目前正在考虑首先在两个LinedHashMap上分别按“索引”状态调用.toArray,然后将其相等性检查到设置的数量。 (voorspellingen是LinkedHashMap 1,uitslagen是另一个LinkedHashMap)
voorspellingen.keySet().toArray()[0])
uitslagen.keySet().toArray()[0])
if (etc.)
但是我不确定这是否是最“有效”的方式...
答案 0 :(得分:1)
我建议仅使用一个HashMap,对于值,请使用同时包含两个结果的对象。
class Results
{
int res1;
int res2;
}
使用上面的类作为您的值类,因此您只需要迭代HashMap一次即可比较对象中的两个结果是否相等。
答案 1 :(得分:0)
有很多方法可以做到这一点,但最清晰的方法可能是遍历一个映射的键集:
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,但是如果您有数百万的用户,将预测和结果分组在同一个对象中确实会更好。
答案 2 :(得分:0)
我本来应该以对象形式放置值而不是放置两个映射。但是,这里要权衡的是,我们将失去出现的确定性价值的顺序。
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;
}
}