我在MasterList表中的查询获取以下记录:

id   listName            listValue
1   Type of Repository  Animal Specimen
2   Type of Repository  Human Specimen
3   Type of Repository  Environmental Specimen
4   Type of Repository  Microorganism Culture Collection
5   Type of Repository  Vegetal Specimen
6   Type of Repository  Other


每个记录/行都是一个对象,并作为对象列表存储在以下列表中

List<MasterList> typeOfRepositoryMasterList


同样,每个对象都有相应的getter方法用于obj.getListValue();

然后从其他查询到biobankList表,我有以下记录:

biobankId listName           listValue
1       Type of Repository  Animal Specimen
1       Type of Repository  Human Specimen
1       Type of Repository  Microorganism Culture Collection
1       Type of Repository  Vegetal Specimen


同样,这些记录也可以作为对象列表使用

List<biobankList> typeOfRepositoryBiobankList


并且这里的每个对象还具有相应的getter方法。

我想要做的是,对于第一个记录集中的所有listValue,如果第二个记录集中存在相同的listValue,则将其添加到新列表中,例如selectedList。第二个记录集中不存在的两个listValue应该添加到availableList中。图片可能会更好地说明。

for(MasterList attributeMaster: typeOfRepositoryMasterList){
        boolean selected = false;
        for(biobankList attribute: typeOfRepositoryBiobankList){
            if(attributeMaster.getListValue().equals(attribute.getListValue())){
                System.out.println("equal");
                selected = true;
                selectedList.add(new KeyValuePair(
                        attribute.getListName()+"_"+attribute.getListValue(), attribute.getListValue()));
                break;
            }
            if(!selected){
                System.out.println("not equal");
                availableList.add(new KeyValuePair(
                            attributeMaster.getListName()+"_"+attributeMaster.getListValue(), attributeMaster.getListValue()));

            }
        }


    }


该查询工作正常,但是嵌套嵌套的循环代码显然无法正常工作,因为它多次添加了相同的值。

编辑:我尝试添加boolean,但问题仍然存在。我在selectedList中得到正确的值,但显然availableList包含重复的值。这是屏幕截图。

最佳答案

我相信您的问题出在else语句上。每次调用内部循环且不存在匹配项(属性和attributeMaster具有不同的listValue)时,您的代码都会将该listValue添加到availableList中。

您必须通过以下方式更改逻辑:

在第二个循环之外定义一个布尔值,并将其设置为false。只要找到匹配项(在break;之前),将其设置为true。

在第二个循环之外,检查布尔值是否为真(意味着当前的'attributeMaster'已匹配),不要将其添加到availableList中。这是正确的代码:

for(MasterList attributeMaster: typeOfRepositoryMasterList){
    boolean found = false;
    for(biobankList attribute: typeOfRepositoryBiobankList){
        if(attributeMaster.getListValue().equals(attribute.getListValue())){
            System.out.println("equal");
            selectedList.add(new KeyValuePair(attribute.getListName()+"_"+attribute.getListValue(), attribute.getListValue()));
            found = true;
            break;
        }
    }
    if (!found) {
        System.out.println("not equal");
        availableList.add(new KeyValuePair(attributeMaster.getListName()+"_"+attributeMaster.getListValue(),attributeMaster.getListValue()));

    }
}

08-28 19:16