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作为键,travelCost作为第一个TreeMap中的值,travelBalance作为第二个TreeMap中的值。
我试图比较来自不同地图的两个值,具体取决于travellerId。因此,如果成本&gt;平衡,它应该打印不足的资金。如果费用&lt; =余额,则应打印已批准。如果没有钥匙匹配,则旅行者不存在。
我附加了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
答案 0 :(得分:3)
在设计程序时,并行数据结构通常很麻烦。在这种情况下,最好使用id
,costs
和balance
创建一个Traveler类。将它们存储在一个Map中,其中键是traveller.id。阅读CSV时,必要时添加旅行者,否则更新现有旅行者costs
或balance
。 id
并不是必须在旅行者中,因为它在Map键中,但通常是个好主意。
答案 1 :(得分:2)
由于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
答案 2 :(得分:0)
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}
您的代码不会使用相同的键比较映射,而是比较相同类型的&#34; index&#34;中的映射。 (导致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
}
}
}