Сравните два TreeMaps на основе пары ключ-значение - PullRequest
0 голосов
/ 29 мая 2018
public static void compareTravelBalance(Map<String, Integer> travelCosts, Map<String, Integer> travellerBalances){

    Set set = travelCosts.entrySet();
    Iterator iterator = set.iterator();
    Set set1 = travellerBalances.entrySet();
    Iterator iterator1 = set1.iterator();

    while(iterator.hasNext()) {

        Map.Entry mentry = (Map.Entry)iterator.next();
        Map.Entry mapEntry= (Map.Entry) iterator1.next();
        int cost = (Integer) mentry.getValue();
        int balance = (Integer) mapEntry.getValue();

        if(travellerBalances.containsKey(mentry.getKey())){
            if(cost>balance){
                System.out.println("Insufficient funds for "+mentry.getKey()+": Cost: "+cost+" Balance: "+balance);
            }
            else if(cost<=balance){
                System.out.println("Approved! for: "+mentry.getKey()+": Cost: "+cost+" Balance: "+balance);
            }
        }
        else{
            System.out.println("Traveller ID "+mentry.getKey()+" does not exist");

        }
    }
}

Выше мой код.У меня есть два CSV, данные которых я сохраняю в двух разных TreeMaps - travelCosts и travellerBalances.Ключевыми парами значений являются travellerId в качестве key и travelCost в качестве значения в первом TreeMap и travelBalance в качестве значения во втором TreeMap.

Я пытаюсь сравнить два значения из разных карт в зависимости от travellerId.Таким образом, если стоимость> баланс, он должен печатать Недостаточно средств.Если стоимость <= баланс, он должен напечатать Утверждено.Если не найдено ни одного ключа, путешественник не существует. </p>

Я прикрепил файлы CSV, которые покажут вам мои данные на картах.

Проблема заключается в следующем: если вы посмотрите на данные, он сравнивает Travellerid 2001 с 2002 и 2002 с 2003 и так далее.Вместо этого следует сказать, что 2001 год не существует.Надеюсь, у меня есть смысл.Пожалуйста, спросите, если вам нужна дополнительная информация.

Спасибо. Путевые расходы: первый столбец TravelLid, а третий столбец TravelCost

Баланс командировок - первый столбец TravelLid и третий столбец TravelBalance

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Поскольку travellerId может существовать только на одной из карт, первое, что нужно сделать, это собрать супер-набор ключей:

Map<String, Integer> travelCosts = new TreeMap<>();
travelCosts.put("2001", 2000);
travelCosts.put("2002", 500);
Map<String, Integer> travellerBalances = new TreeMap<>();
travellerBalances.put("2002", 499);
travellerBalances.put("2003", 1155);

Set<String> travellerIds = new TreeSet<>();
travellerIds.addAll(travelCosts.keySet());
travellerIds.addAll(travellerBalances.keySet());

Тест

System.out.println(travellerIds);

Выход

[2001, 2002, 2003]

Теперь вы можете выполнять свою логику:

for (String travellerId : travellerIds) {
    Integer cost = travelCosts.get(travellerId);
    Integer balance = travellerBalances.get(travellerId);
    if (cost == null) {
        System.out.println("Traveller ID " + travellerId + " is missing 'cost': " +
                           "Balance: " + balance);
    } else if (balance == null) {
        System.out.println("Traveller ID " + travellerId + " is missing 'balance': " +
                           "Cost: " + cost);
    } else if (cost > balance) {
        System.out.println("Insufficient funds for " + travellerId + ": " +
                           "Cost: " + cost + " Balance: " + balance);
    } else {
        System.out.println("Approved! for: " + travellerId + ": " +
                           "Cost: " + cost + " Balance: " + balance);
    }
}

Выход

Traveller ID 2001 is missing 'balance': Cost: 2000
Insufficient funds for 2002: Cost: 500 Balance: 499
Traveller ID 2003 is missing 'cost': Balance: 1155
0 голосов
/ 29 мая 2018

При разработке программ параллельные структуры данных обычно проблематичны.В этом случае было бы лучше создать класс Traveler с id, costs и balance.Сохраните их на карте, где ключом является traveller.id.При чтении CSV добавьте путешественника, если необходимо, иначе обновите существующего путешественника costs или balance.id не обязательно должен быть в Traveler, поскольку он находится в ключе карты, но обычно это хорошая идея.

0 голосов
/ 29 мая 2018
    Map.Entry mentry = (Map.Entry)iterator.next();
    Map.Entry mapEntry= (Map.Entry) iterator1.next();
    int cost = (Integer) mentry.getValue();
    int balance = (Integer) mapEntry.getValue();

Ну, entrySet().iterator() возвращает ваши сопоставления в порядке возрастания ключа.

Первая карта вернет {2001-x, 2002-y, 2003-z}

И вторая карта вернет {2002-x1, 2003-y1, 2004-z1}

Ваш код не сравнивает сопоставления по одному и тому же ключу, но сравнивает сопоставления в одном и том же «индексе» (что приводит к сравнению 2001-x с 2002-x1)

Вы хотите путешествовать по ключу, а не обоим:

public static void compareTravelBalance(Map<String, Integer> travelCosts, Map<String, Integer> travellerBalances){

     Iterator<String> keys = travelCosts.keySet().iterator();

     while (keys.hasNext()) {
         String key = keys.next();
         if (!travellerBalances.containsKey(key)) {
            System.out.println("Traveller ID "+mentry.getKey()+" does not exist");
         } else {
             int cost = travelCosts.get(key);
             int balance = travellerBalances.get(key);
             // ... compare cost and balance
         }
     }
}
...