6

固定数の列を持つTableModelを作成していますが、行数は変化します (ほとんどの場合、時間の関数として増加します)。データを保存するためのより良いアプローチはどれでしょう。

ArrayList[] columns = new ArrayList[numberOfColumns];
// Each array element is one column. Fill each of them with a new ArrayList.
...
public Object getValueAt(int row, int column) {
    return columns[column].get(row);
}

つまりArrayList、それぞれArrayListが 1 つの列を表す の配列を作成する、または:

ArrayList<Object[]> rows = new ArrayList<Object[]>();
// Each ArrayList element is one row.

public Object getValueAt(int row, int column) {
    return rows.get(row)[column];
}

つまり、配列を保持する 1 つの ArrayList を作成し、それぞれが 1 つの行を表します。

これらのうち、速度またはストレージの点でより効率的なアイデアはありますか? 代替案 1 ではArrayList、行を追加するたびに N を拡張する必要がありますが、代替案 2 では、1 つだけ拡張するだけでArrayListなく、長さ N の新しい配列を作成する必要があります (新しい行を表すため)。または、明白でより良い解決策はありますか?

4

4 に答える 4

6

列の数が固定されている場合、データはおそらく行指向であるか、少なくとも行変数であり、その時点で各行は配列である必要があります。固定数の列は、配列を再割り当てする必要がないことを意味します。

したがって、あなたの構造は次のとおりです。

List<Object[]> rows;

ここで、配列要素は 1 行です。

ただし、行オブジェクトがどうあるべきかについては、いくつかのオプションがあります。

  1. 配列。
  2. AListまたはその他Collection; また
  3. カスタム オブジェクト。

(3) おそらく、列の数、タイプ、および名前を照会できる何らかのインターフェースを使用して実行できます。

于 2010-02-23T08:22:08.007 に答える
2

単一の ArrayList 自体を使用して、このような要素にアクセスするのはどうですか

public Object getValueAt(int row, int column) { 
    return data.get(row*NUMBER_OF_COLUMNS+column); 
} 

この場合、各 ArrayList オブジェクトはテーブル内のセルです。また、他の追加の構造を必要とする必要はありません

于 2010-02-23T08:23:57.753 に答える
1

個人的には、固定長配列の ArrayList を使用したいと思います。大量の行について話している場合、これは、長さ 10 の配列によって開始される一連の ArrayLists を割り当てるよりも、スペース効率が高い (そしておそらく速い) 場合があります。したがって、列が 10 より少ない場合無駄なスペースになってしまいます。一方、それ以上ある場合は、列を追加するときに ArrayList のバッキング配列のサイズを変更する必要があります。

編集:実際には、ArrayList のコンストラクターで容量を設定できるため、大きな違いはないと思います: http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html

于 2010-02-23T08:30:08.243 に答える