1

ハッシュマップを使用して選択したチェックボックスを保存する JSF テーブルがあります。私の質問は: ハッシュマップの代わりに 2D Java 配列を使用してキーを格納することは可能ですか?

EDIT このコードを使用して、選択したキーを保存します。このコードをどのように書き換えることができますMapか?

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

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

私の考えは、ページ数とページ上のリストを格納する2D配列(MAPを使用します)を作成することです。たとえば、100 ページ x 10 キー。

編集2

Oracleからデータを取得する遅延ロードを使用してJSFテーブルを作成しました。JSF は非常にうまく高速に動作します。私が直面している問題は、select allすべてのケイを取り、キーを に格納するチェックボックスを作成しようとしたときhashmapです。後でこれらのキーは SQL クエリで使用され、ユーザーが選択した行を削除します。10,000 行のデータベース テーブルを作成し、それらを JSF テーブルに表示しました。10 000 で作成したものすべてをクリックするhashmapと、そのサイズのパフォーマンスは比較的良好です。私はそれらを削除するためにテストしhashmapましたhashmap. これは表示ですが、いくつかのコードの最適化を行うことができます。大きな問題はスケーラビリティです。私はhashmap1 000 000 キーで - 動作しますが、非常に遅いです。非常に大きなデータを処理するために JSF テーブルを設計する必要があります。解決策は2D配列を使用することだと思います(この例ではそれを呼び出しましょう)。私の考えを次のように説明します。たとえば、100 ページの JSF テーブルがあります。各ページには 10 行が含まれます。標準hashmapでは、すべての行を選択すると 1000 個のキーがあります。2D 配列ソリューションでは、100 個の要素を持つ配列を作成できます。ページを切り替えると、ページネーション コードから生成される行は 10 行しかありません。すべてのデータベース行を選択すると、表示されている行キーのみを 2D 配列に挿入できます。たとえば、私が置き換える配列への他の位置1何かがあることを知るために。削除ボタンを押すと、Java コードはすべての要素が「仮想的に」選択されていることを認識します。より良い、より簡単な解決策はありますか?

4

1 に答える 1

4

AMapはメソッドによる動的展開ができるput()ので事前に用意する必要はありませんが、配列は動的展開ができないので固定サイズであらかじめ手動で用意しておく必要があります。

2D 配列は準備が難しく、技術的にペアの 1D コレクションだけが必要な場合はまったく意味がありません。1D 配列を使用し、テーブルの行インデックスを配列インデックスとして使用すると簡単です。

例えば

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行インデックスの代わりにアイテム自身によってキー付けされた Aidは、はるかに簡単です。


更新

a の「すべて選択」は、次のBoolean[]ように単純にする必要があります。

Arrays.fill(checked, Boolean.TRUE);

i3 ラップトップでテストしたところ、1,000,000 エントリで 20 ミリ秒で完了しました。パフォーマンスの問題は、おそらく永続層で探す必要があります。

于 2012-05-25T19:08:13.070 に答える