如何比较具有多个值的键的两个映射?

时间:2016-12-28 14:48:00

标签: java collections

我按照以下方式跟踪了两张地图:

Map<String,List<String>> sourceTags = sourceList.get(block);
Map<String,List<String>> targetTags = targetList.get(block);

我想将sourceTags中的值列表与对应于该键的targetTags中的值列表进行比较。

现在,地图条目中的值将采用以下方式:

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]

我想要输出如下:

  

块引用

key-22F,比较子列为CAMV的值列表,如果存在子键,则比较差值,否则如果子键不存在则报告。

  

块引用

再次,Key-98A,子键:XDTE,MEET,RDTE。如果存在子键并且发现源和目标中的值不同,则报告。否则如果未找到子键未在源或目标中找到,则值的情况也是如此。

if(sub-key found){
//compare their values
}else{
//report as sub-key not found
}

我写了以下程序:

编辑该计划

设置tags = 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);
            }

执行后,比较报告显示错误的值。

请帮助!!

1 个答案:

答案 0 :(得分: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...
                }
            }
        }
    }

这样,当索引到达第一个列表的末尾时,你甚至不需要继续进入另一个列表......就像你现在一样...