来自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
。图片可能会更好地解释。
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包含重复值。这是屏幕截图。
答案 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);