我有以下以下方式两张地图:如何比较两个具有多个值的键的地图?
Map<String,List<String>> sourceTags = sourceList.get(block);
Map<String,List<String>> targetTags = targetList.get(block);
我想比较与对应于关键targetTags值列表sourceTags值的列表。
如今,在映射项的值会以下列方式:
SourceTag = [20C=[:ABC//0000000519983150], 22F=[:CAMV//MAND, :CAMV//MANDA], 98A[:XDTE//20160718,:MEET//20160602,:RDTE//20160719]
TargetTag = [20C=[:ABC//0000000519983150], 22F=[:CAMV//MAND],98A=[:MEET//20160602,:RDTE//20160719]
我想要的输出如下:
块引用
键22F,比较值列表和子密钥是CAMV,如果子密钥存在,比较差异,否则如果子密钥不存在则报告。
块引用
再次,钥匙98A,子键:XDTE,见面,RDTE。如果子键存在并发现源和目标中的值存在差异,则报告。否则,如果在源或目标中未找到子键未找到报告,则与值相同。
if(sub-key found){
//compare their values
}else{
//report as sub-key not found
}
我写了下面的程序:
编辑的程序
设置标签= sourceTags.keySet();
for(String targetTag : tags){
if(targetTags.containsKey(targetTag)){
List<String> sourceValue = sourceTags.get(targetTag);
List<String> targetValue = targetTags.get(targetTag);
for(String sValue : sourceValue){
for(String tValue : targetValue){
if(sValue.length() > 4 && tValue.length() > 4){
//get keys for both source and target
String sKey = sValue.substring(1, 5);
String tKey = tValue.substring(1,5);
//get values for both source and target
String sTagValue= sValue.substring(sValue.lastIndexOf(sKey), sValue.length());
String tTagValue = tValue.substring(tValue.lastIndexOf(tKey),tValue.length());
if(sKey.equals(tKey)){
if(!sTagValue.equals(tTagValue)){
values = createMessageRow(corpValue, block ,targetTag, sTagValue,tTagValue);
result.add(values);
}
}
}
}
}
}else{
System.out.println(sourceTags.get(targetTag).get(0));
values = createMessageRow(corpValue,block,targetTag,sourceTags.get(targetTag).get(0),"","Tag: "+targetTag+" not availlable in target");
result.add(values);
}
执行后,比较报告显示错误的值。
请帮忙!!
这是测试驱动开发的绝佳选择。它会迫使你将自己的条件分解成自己的函数,回答你当前提出的问题,并且保存下一个需要修改代码的开发者的理智。 – axlj
是的,打破你的代码是关键。可能你从来没有听说过“单一抽象层”原则。研究它......你的代码可以从中受益匪浅。 – GhostCat
我提供了完整的程序,所以没有人说我没有为这个问题做过任何事情。现在,只写逻辑到目前为止,我还是应该删除上面的代码? – vermaraj