我有一个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代码将知道所有元素都被“虚拟”选中。有更好,更简单的解决方案吗?
答案 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个条目。您应该在持久层中寻找性能问题。