是否可以使用2D数组来存储JSF复选框?

时间:2012-05-25 18:29:15

标签: java jsf jsf-2 hash

我有一个JSF表,它使用Hashmap存储选中的复选框。我的问题是:是否可以使用2D Java数组来存储密钥而不是Hashmap?

修改 我使用此代码存储选定的键。如何为Map重写此代码?

private HashMap<String, Boolean> selected = new HashMap<>();

    // send the list
    public Map<String, Boolean> getselected() {
        return selected;
    }

我的想法是创建2D数组(它将使用MAP),它将在页面上存储页面数和列表数。例如100页x 10键。

编辑2

我使用延迟加载创建了JSF表,该表从Oracle获取数据。 JSF工作得非常好,速度很快。我遇到的问题是当我尝试创建select all复选框时,它会占用所有kays并将密钥存储到hashmap。稍后这些键将用于SQL查询以删除用户选择的行。 我创建了10 000行的数据库表,并将它们显示在JSF表中。当我点击它们时,我创建了hashmap 10 000个。对于那个大小,性能相对较好。我测试删除它们 - 我创建了Java方法,它使用生成的hashmap并使用存储在hashmap中的密钥删除数据库行。它显示但可以做一些代码优化。 最大的问题是可扩展性。我用1 000 000个密钥测试了hashmap - 它可以工作,但速度非常慢。我需要设计JSF表来处理非常大的数据。 我认为解决方案是使用2D数组(让我们在这个例子中调用它)。我会这样解释我的想法: 我将有例如100页的JSF表。每个页面都有10行。进入标准hashmap当我选择所有行时,我将有1000个键。 在2D数组解决方案中,我可以创建包含100个元素的数组,当我在页面之间切换时,我将只有10行将从分页代码生成。当我选择所有数据库行时,我只能将可见行键插入到2D数组中。进入数组的其他位置我用例如1替换,以便知道有什么东西。当我按下删除按钮时,Java代码将知道所有元素都被“虚拟”选中。有更好,更简单的解决方案吗?

1 个答案:

答案 0 :(得分:4)

Map允许通过put()方法进行动态扩展,因此您无需在使用前进行准备,但是数组不允许动态扩展,必须事先手动准备固定大小。

2D阵列很难准备,如果你在技术上只想要一对的一对集合,那就没有任何意义。如果使用1D数组并将表的行索引用作数组索引,则会更容易。

E.g。

private List<Item> items;
private Boolean[] checked;

@EJB
private ItemService service;

@PostConstruct
public void init() {
    items = service.list();
    checked = new Boolean[items.size()];
}

<h:dataTable binding="#{table}" value="#{bean.items}" var="item">
    <h:column>
        <h:selectBooleanCheckbox value="#{bean.checked[table.rowIndex]}" />
    </h:column>
</h:dataTable>

如果引入分页或过滤或动态添加/删除行,这可能会造成严重破坏。您需要手动调整阵列的大小并每次都进行排序。由项目自己的Map而不是行索引键入的id比以前容易得多。


更新

Boolean[]的“全选”应该像

一样简单
Arrays.fill(checked, Boolean.TRUE);

我在i3笔记本电脑上进行了测试,并且在20分钟内完成了1,000,000个条目。您应该在持久层中寻找性能问题。