1

我有一个 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. 它的显示,但可以做一些代码优化。最大的问题是可扩展性。我测试了hashmap有 1 000 000 个键 - 它可以工作,但速度非常慢。我需要设计 JSF 表来处理非常大的数据。我认为解决方案是使用 2D 数组(让我们在这个例子中调用它)。我将这样解释我的想法:例如,我将有 100 页的 JSF 表。每页将有 10 行。进入标准hashmap时,当我选择所有行时,我将有 1000 个键。在二维数组解决方案中,我可以创建包含 100 个元素的数组,当我在页面之间切换时,我将只有 10 行,这些行将从分页代码中生成。当我选择所有数据库行时,我只能将可见行键插入二维数组。例如,我替换的数组中的其他位置1为了知道有什么东西。当我按下删除按钮时,Java 代码将知道所有元素都被“虚拟”选中。有没有更好更简单的解决方案?

4

1 回答 1

4

AMap允许通过put()方法动态扩展,所以使用前不需要准备,但数组不允许动态扩展,必须事先手动准备固定大小。

如果从技术上讲,您只想要一个 1D 对集合,那么 2D 阵列很难准备并且完全没有意义。如果您使用一维数组并将表的行索引用作数组索引,则会更容易。

例如

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而不是行索引键入的A则容易得多。


更新

a 的“全选”Boolean[]应该很简单

Arrays.fill(checked, Boolean.TRUE);

我在 i3 笔记本电脑上对其进行了测试,它在 20 毫秒内完成了 1,000,000 个条目。您的性能问题可能应该在持久层中寻找。

于 2012-05-25T19:08:13.070 回答