gpt4 book ai didi

java - 是否可以使用二维数组来存储 JSF 复选框?

转载 作者:行者123 更新时间:2023-11-29 03:46:14 25 4
gpt4 key购买 nike

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

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

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

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

我的想法是创建二维数组(将使用 MAP)来存储页面数和页面上的列表。例如 100 页 x 10 个键。

编辑 2

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

最佳答案

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

二维数组很难准备,如果您在技术上只想要一维数组对,那么它毫无意义。如果您使用一维数组并将表的行索引用作数组索引,则会更容易。

例如

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 个条目。您的性能问题可能应该在持久层中寻找。

关于java - 是否可以使用二维数组来存储 JSF 复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10759654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com