我有以下以下方式兩張地圖:如何比較兩個具有多個值的鍵的地圖?
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