Как сравнить значение в одной хэш-карте с тем же значением в другой хэш-карте? - PullRequest
0 голосов
/ 22 октября 2018

Доброе утро,

Извините, если об этом уже спрашивали, но я застрял в проекте Java, который я строю.

Это программа, которая позволяет пользователю вставитьставка (например, прогнозируемый результат спортивного матча) и позднее позволяет пользователю вставить окончательный результат указанного матча.

Это делается с помощью 2 LinkedHashMaps.Один с парой ключ-значение «Пользователь» и прогнозируемой оценкой, а другой - «Пользовательская и окончательная оценка».

Порядок ключей в обоих LinkedHashMaps будет таким же, как они получают ввод для ключа из другого массива симена пользователей.Таким образом, каждый раз устанавливается только прогнозируемый и окончательный счет.(Ключ устанавливается путем вызова .get для массива с именами пользователей).

Что я хочу сделать, это сравнить значение в LinkedHashMap с прогнозируемыми оценками и значением в LinkedHashMap с окончательнымГол.Это, однако, необходимо сравнить для каждой пары ключ-значение.Поэтому я не могу просто проверить на равенство обоих LinkedHashMaps.Например, с четырьмя пользователями только один может предсказать правильный счет.Если я проверяю равенство обоих LinkedHashMaps для другого, он проверяет пары ключ-значение в целом.Мне нужно получить один логический результат для каждой пары ключ-значение.

Я думал о проверке равенства индексации значения, но это не то, как работает LinkedHashMaps.Ключ LinkedHashMap и значение LinkedHashMap являются пользовательскими объектами (ключ является экземпляром класса с заданной строкой в ​​нем, а значение является перечислением).

Как бы я поступил так?

В настоящее время я думаю о том, чтобы сначала вызвать .toArray для обоих LinedHashMap для каждого «индексного» размещения и проверить равенство этого значения с заданным значением… вот так;(voorspellingen - это LinkedHashMap 1, uitslagen - это другой LinkedHashMap)

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

Но я не уверен, что это будет самый "эффективный" способ сделать это ...

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Есть много способов сделать это, но, вероятно, самый разборчивый - это перебрать набор ключей одной карты:

    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, но если у вас миллионы пользователей, возможно, было бы лучше сгруппировать прогноз и результат в одном объекте.

0 голосов
/ 22 октября 2018

Я бы поставил карту вместо двух со значениями в виде объекта.Но компромисс здесь заключался бы в том, что мы потеряли бы последовательность определяющего значения.

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;
    }
}
0 голосов
/ 22 октября 2018

Я предлагаю использовать только один HashMap, а для значения используйте объект, который содержит оба результата.

class Results
{
    int res1;
    int res2;
}

Используйте вышеуказанный класс в качестве класса значений, поэтому вам просто нужноВыполните итерацию по HashMap один раз, чтобы сравнить, равны ли два результата в объекте.

...