2016-12-28 93 views
1

我有以下以下方式兩張地圖:如何比較兩個具有多個值的鍵的地圖?

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); 
      } 

執行後,比較報告顯示錯誤的值。

請幫忙!!

+3

這是測試驅動開發的絕佳選擇。它會迫使你將自己的條件分解成自己的函數,回答你當前提出的問題,並且保存下一個需要修改代碼的開發者的理智。 – axlj

+0

是的,打破你的代碼是關鍵。可能你從來沒有聽說過「單一抽象層」原則。研究它......你的代碼可以從中受益匪淺。 – GhostCat

+0

我提供了完整的程序,所以沒有人說我沒有爲這個問題做過任何事情。現在,只寫邏輯到目前爲止,我還是應該刪除上面的代碼? – vermaraj

回答

1

實際上,你的代碼有一個主要的邏輯流程。當你比較包含在這兩個地圖使用相同的密鑰訪問的列表,你這樣做:

for(int index = 0; index < Math.max(sourceValue.size(), targetValue.size()); index ++){ 
    if(index<sourceValue.size() && index<targetValue.size()){ 
     //Do your comparations... 
    } 

這意味着,你前進的兩個列表繼續進行相同的索引,然後你比較兩個項目。永遠不要將第一個列表的項目與第二個列表中沒有相同索引的項目進行比較。

我給你舉個例子:有兩個列表

LIST_A = (A, B, C) 
LIST_B = (C, B, A) 

這些都是你正在做的比較:

A == C 
B == B 
C == A 

很明顯那時,即使兩個列表包含相同元素唯一的對應關係是B == B.

您需要將第一個列表中的每個項目與第二個列表中的所有項目進行比較,以獲得所有匹配的對。喜歡的東西(不包括優化和優雅爲清晰起見):

for(String sValue : sourceValue){ 
     for(String tValue : targetValue){ 
      if(sValue.length() > 4 && tValue.length() > 4){ 
       String sKey = sValue.substring(1,5); 
       String tKey = tValue.substring(1,5); 
       if(sKey.equals(tKey)){ 
        //Do your logic... 
       } 
      } 
     } 
    } 

這樣,你甚至不需要在其他列表進行時的指標達到第一個喜歡你現在要做的結束.. 。

+0

謝謝Matt,我在程序中做了同樣的改變,它做了同樣的工作。只需添加一件事,否則條件 – vermaraj

+0

我的意思是說,如果子密鑰在第二個列表中不可用,那麼我們還必須報告爲不可用的子密鑰。 – vermaraj