迭代并比较Java List

时间:2014-08-29 13:33:03

标签: java list liferay

来自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,请将其添加到新列表中说{{1} }}。应将第二个记录集中不存在的两个selectedList添加到listValue。图片可能会更好地解释。enter image description here

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())); } } } ,但问题仍然存在。我在selectedList中获取了正确的值,但显然availableList包含重复值。这是屏幕截图。enter image description here

2 个答案:

答案 0 :(得分:1)

我相信你的问题在于else语句。每次调用内部循环并且没有匹配(属性和属性具有不同的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()));

    }  
} 

答案 1 :(得分:1)

最好重新考虑解决问题的整个方法。

我会创建两个集合,每种类型一个:

Set<String> typeOfRepositoryMasterList
Set<String> typeOfRepositoryBiobankList

之后,您可以使用以下方法轻松创建两个所需的集:

//Selected list is an intersection of the two sets
selectedList = new HashSet<String>(typeOfRepositoryMasterList);
selectedList.retainAll(typeOfRepositoryBiobankList);

//Available list can be constructed in a similar fashion
availableList = new HashSet<String>(typeOfRepositoryMasterList);
availableList.addAll(typeOfRepositoryBiobankList);
availableList.removeAll(selectedList);