我在Datatable1中有产品信息列表 和 Datatable2中已选择的产品信息列表(用户从Datatable1中选择并添加到dattable2) 现在我想进行一次检查,如果用户从Datatable1中选择添加&如果列表中已存在相同的数据,则不应将其添加到数据表2的列表中 我的朋友建议使用
HashMap<String ,List<Model>>
是实现功能的更好方法吗? 感谢
答案 0 :(得分:2)
如果您可以使用java.util.Set
实施而不是List
,则可以按如下方式构建Model
的无重复列表:
Set<Model> dataTable1 = ...
Set<Model> dataTable2 = ...
dataTable2.addAll(dataTable1);
dataTable2
将包含dataTable1
或dataTable2
中的所有内容,但不包含任何重复内容(设置联合操作)。
请务必在equals
课程上实施适当的hashCode
和Model
。
答案 1 :(得分:2)
Rai是对的,以防你想为每个操作添加一个 Product
,就像在视图中一样(由迭代组件包围)
<h:commandButton value="Add to selected" actionListener="#{bean.addProductToList2}>
<f:setPropertyActionListener value="#{product}" target="#{bean.selectedProduct}/>
<f:ajax render="table2/>
</h:commandButton>
与
private Product selectedProduct;
public void addProductToList2(ActionEvent event) {
if(!list2.contains(selectedProduct)){
list2.add(selectedProduct);
}
}
此外,他对两个名单的选择是正确的。
如果您想添加一次添加所有选定产品的可能性,您可以使用复选框
<h:selectBooleanCheckbox valueChangeListener="#{bean.toggleProductInList2}">
<f:setPropertyActionListener value="#{product}" target="#{bean.selectedProduct}/>
</h:selectBooleanCheckbox>
带
private Product selectedProduct;
public void toggleProductInList2(ValueChangeEvent event) {
Boolean isChecked = (Boolean) event.getNewValue();
if(isChecked){
list2.add(selectedProduct);
} else {
list2.remove(selectedProduct);
}
}
这样就可以准备一个列表,并可以点击按钮显示:
<h:commandButton value="Show selected">
<f:ajax render="table-container"/>
</h:commandButton>
<h:panelGroup id="table-container">
<ui:repeat...>
</ui:repeat>
</h:panelGroup>
答案 2 :(得分:1)
不要认为你需要HashMap; List or Set
将完成这项工作。
List<Product> list1 = new ArrayList<Product>(); //from DataTable1
List<Product> list2 = new ArrayList<Product>(); //from Datatable2
Product p; //product which needs to be added to list2
if(!list2.contains(p)){
list2.add(p);
}
//write list2 to db
因此,只有在产品尚不存在的情况下才放置产品。