Java 如何比较具有多个值的键的两个贴图?

Java 如何比较具有多个值的键的两个贴图?,java,collections,Java,Collections,我有以下两张地图,方式如下: Map<String,List<String>> sourceTags = sourceList.get(block); Map<String,List<String>> targetTags = targetList.get(block); 我希望输出如下所示: 大宗报价 键-22F,比较子键为CAMV的值列表,如果子键存在,则比较差异,否则如果子键不存在,则也报告 大宗报价 同样,98A键,子键:XDTE,MET

我有以下两张地图,方式如下:

Map<String,List<String>> sourceTags = sourceList.get(block);
Map<String,List<String>> targetTags = targetList.get(block);
我希望输出如下所示:

大宗报价

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

大宗报价

同样,98A键,子键:XDTE,METE,RDTE。若子键存在,并且发现源和目标中的值存在差异,则报告。否则,如果在源或目标中未找到子键报告为未找到,则值的情况也是如此

if(sub-key found){
//compare their values
}else{
//report as sub-key not found
}
我编写了以下程序:


编辑了该节目

Set tags=sourceTags.keySet()

for(字符串targetTag:tags){
if(targetTags.CONTANSKEY(targetTag)){
List sourceValue=sourceTags.get(targetTag);
List targetValue=targetTags.get(targetTag);
for(字符串sValue:sourceValue){
for(字符串tValue:targetValue){
if(sValue.length()>4&&tValue.length()>4){
//获取源和目标的密钥
字符串sKey=sValue.substring(1,5);
字符串tKey=tValue.substring(1,5);
//获取源和目标的值
String sTagValue=sValue.substring(sValue.lastIndexOf(sKey),sValue.length());
字符串tTagValue=tValue.substring(tValue.lastIndexOf(tKey),tValue.length());
如果(sKey等于(tKey)){
如果(!sTagValue.equals(tTagValue)){
values=createMessageRow(corpValue、block、targetTag、sTagValue、tTagValue);
结果。添加(值);
}
}
}
}
}
}否则{
System.out.println(sourceTags.get(targetTag.get(0));
values=createMessageRow(corpValue、block、targetTag、sourceTags.get(targetTag.get)(0),“”,“Tag:”+targetTag+“在目标中不可用”);
结果。添加(值);
}
执行后,比较报告显示错误的值


请提供帮助!!

事实上,您的代码有一个主要的逻辑流。当您比较使用相同键访问的两个映射中包含的列表时,您可以执行以下操作:

for(int index = 0; index < Math.max(sourceValue.size(), targetValue.size()); index ++ ){
    if(index<sourceValue.size() && index<targetValue.size()){
         //Do your comparations...   
    }
以下是您正在进行的比较:

A == C
B == B
C == A
很明显,即使这两个列表包含相同的元素,也只能找到B==B的对应关系

您需要将第一个列表中的每个项目与第二个列表中的所有项目进行比较,以获得所有匹配对。类似于(为了清晰起见,没有优化和优雅):


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

这是测试驱动开发的一个很好的候选者。它将迫使您将条件分解为自己的函数,回答您当前提出的问题,并保存下一个开发的健全性这需要修改代码。是的,分解代码是这里的关键。也许你从来没有听说过“单一抽象层”原则。研究它…你的代码可能会从中受益匪浅。我提供了完整的程序,所以没有人说我没有为这个问题做过任何事情。现在,只写逻辑,我在这方面做了什么,或者我应该删除上面的代码吗?你不能尝试将代码重构成更小的块,以便更具可读性吗?不我的方法很有意义。谢谢Matt,我在程序中做了相同的更改,它做了相同的工作。只需添加一件事,否则我的意思是,如果第二个列表中的子键不可用,那么我们也必须报告为子键不可用。
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
    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...
                }
            }
        }
    }