【问题标题】:Is it possible to use 2D array to store JSF checkboxes?是否可以使用二维数组来存储 JSF 复选框?
【发布时间】:2012-06-01 08:17:23
【问题描述】:

我有一个 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 复选框时,该复选框将获取所有密钥并将密钥存储到 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 代码将知道所有元素都是“虚拟”选择的。有没有更好更简单的解决方案?

【问题讨论】:

  • 你为什么不使用一个简单的数组列表呢? (保持简单...)
  • 我想做一个懒加载的实验。
  • @Daniel 你知道这可能吗?
  • 自己没试过……BalusC给了你很好的答案……
  • INMO 你最好只选择可见的行......而不是其他分页页面上的行......如果用户想要删除表中的所有行,你最好提供额外的按钮“删除所有行”

标签: java jsf jsf-2 hash


【解决方案1】:

Map 允许通过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>

但是,如果您引入分页或过滤或动态添加/删除行,这可能会造成严重破坏。您每次都需要手动调整数组的大小和排序。由项目自己的id 而不是行索引作为键的Map 这样就容易多了。


更新

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

Arrays.fill(checked, Boolean.TRUE);

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

【讨论】:

  • 我更新了帖子。请您告诉我必须如何编辑我的代码。我不知道 JSF 是否能够通过我的具体实现在这种情况下工作。
  • 您可以在此处找到如何正确使用Map 的具体启动示例:stackoverflow.com/questions/2524514/…
  • 我建议从头开始。也许如果我告诉你一切,你可以告诉我什么是最好的解决方案。我会把它写到帖子里。
  • 如果你没有删除测试代码,你能告诉我有多少内存占用了 HashMap 与 String 有 6 个字符。也许我认为我的错误在哪里 - 当我单击“全选”时,我会从数据库中获取带有键的列表,然后将键放入带有 TRUE 标志的哈希图中。瓶颈是数据库查询。可能的解决方案可能是在 bean 使用期间从数据库生成密钥到第二个线程。
猜你喜欢
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2021-08-01
  • 2020-12-27
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多