2016-12-28 84 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