避免数据表中的重复值

时间:2013-02-15 08:23:15

标签: java jsf-2 richfaces

我在Datatable1中有产品信息列表 和 Datatable2中已选择的产品信息列表(用户从Datatable1中选择并添加到dattable2) 现在我想进行一次检查,如果用户从Datatable1中选择添加&如果列表中已存在相同的数据,则不应将其添加到数据表2的列表中 我的朋友建议使用

 HashMap<String ,List<Model>>

是实现功能的更好方法吗? 感谢

3 个答案:

答案 0 :(得分:2)

如果您可以使用java.util.Set实施而不是List,则可以按如下方式构建Model的无重复列表:

Set<Model> dataTable1 = ...
Set<Model> dataTable2 = ...
dataTable2.addAll(dataTable1);

dataTable2将包含dataTable1dataTable2中的所有内容,但不包含任何重复内容(设置联合操作)。

请务必在equals课程上实施适当的hashCodeModel

答案 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

因此,只有在产品尚不存在的情况下才放置产品。