首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于键值对比较两个TreeMaps

基于键值对比较两个TreeMaps
EN

Stack Overflow用户
提问于 2018-05-29 10:06:38
回答 3查看 977关注 0票数 0
代码语言:javascript
复制
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和作为第一个TreeMap中的值的travelCost以及作为第二个TreeMap中的值的travelBalance。

我正在尝试比较来自不同映射的两个值,具体取决于travellerId。因此,如果cost>balance,它应该打印不足的资金。如果为cost<=balance,则应打印已批准。如果没有匹配的key,则说明旅行者不存在。

我附加了CSV,它将显示我在地图中的数据。

问题是:如果你看一下数据,它是比较travellerid 2001到2002,2002到2003,等等。相反,它应该说2001不存在。我希望我说的有道理。如果您需要更多的信息,请询问。

谢谢。Travel Costs-first col is travellerId and the third col is travelCost

Travel Balances - the first col is travellerId and third col is travelBalance

EN

回答 3

Stack Overflow用户

发布于 2018-05-29 10:50:37

在设计程序时,使用并行数据结构通常很麻烦。在这种情况下,使用idcostsbalance创建Traveller类会更好。将这些存储在以traveller.id为关键字的映射中。在读取CSV时,必要时添加一个旅行者,否则更新现有的旅行者costsbalanceid不一定要在Traveller中,因为它在Map key中,但通常是个好主意。

票数 3
EN

Stack Overflow用户

发布于 2018-05-29 10:41:01

由于travellerId可能只存在于其中一个映射中,因此要做的第一件事是收集键的超集:

代码语言:javascript
复制
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());

测试

代码语言:javascript
复制
System.out.println(travellerIds);

输出

代码语言:javascript
复制
[2001, 2002, 2003]

你现在可以做你的逻辑了:

代码语言:javascript
复制
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);
    }
}

输出

代码语言:javascript
复制
Traveller ID 2001 is missing 'balance': Cost: 2000
Insufficient funds for 2002: Cost: 500 Balance: 499
Traveller ID 2003 is missing 'cost': Balance: 1155
票数 2
EN

Stack Overflow用户

发布于 2018-05-29 10:39:03

代码语言:javascript
复制
    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-x2002-x1进行比较)

你想要的是按键旅行,而不是两者都用:

代码语言:javascript
复制
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
         }
     }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50575399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档