70

オブジェクトのタイプを含むことができるテーブルに似た機能を持つインターフェイスを実装しています。インターフェイスは次の機能を指定します。

double[] getDoubles(int columnIndex);

私が困惑しているのは、私の実装では、テーブル データを 2DObject配列 ( Object[][] data) に格納していることです。値を返す必要がある場合は、次のようにします (getDoubles()は double を含む列でのみ呼び出されると想定されるため、 はありませんClassCastExceptions)。

double[] getDoubles(int columnIndex) {
    return (double[]) data[columnIndex];
}

Object[]しかし - Java はにキャストすることを許可していませんdouble[]。はプリミティブではなくオブジェクトであるDouble[]ため、キャストしても問題ありませんが、私のインターフェイスでは、データが . として返されるように指定されています。Doubledouble[]

だから私は2つの質問があります:

  1. テーブルから列データを取得し、Object[][]プリミティブの配列を返す方法はありますか?
  2. インターフェイスを returnDouble[]に変更した場合、パフォーマンスに影響はありますか?
4

8 に答える 8

92

サードパーティのライブラリを使用してもかまわない場合、commons-langにはさまざまな操作方法を備えたArrayUtilsタイプがあります。

Double[] doubles;
...
double[] d = ArrayUtils.toPrimitive(doubles);

補完的な方法もあります

doubles = ArrayUtils.toObject(d);

編集:残りの質問に答えます。これを行うにはいくらかのオーバーヘッドがありますが、アレイが本当に大きくない限り、心配する必要はありません。リファクタリングの前に、まずそれをテストして問題があるかどうかを確認します。

実際に質問したメソッドを実装すると、次のようになります。

double[] getDoubles(int columnIndex) {
    return ArrayUtils.toPrimitive(data[columnIndex]);
}
于 2009-07-10T15:09:48.457 に答える
53

Java 8 では、これはワンライナーです。

Double[] boxed = new Double[] { 1.0, 2.0, 3.0 };
double[] unboxed = Stream.of(boxed).mapToDouble(Double::doubleValue).toArray();

これは元の配列を繰り返し処理し、新しい配列を作成することに注意してください。

于 2015-05-08T06:55:13.993 に答える
34

残念ながら、リスト全体をループしてDoubledouble[].

パフォーマンスに関する限り、Java のプリミティブのボックス化とボックス化解除に関連する時間がいくらかあります。セットが十分に小さい場合、パフォーマンスの問題は発生しません。

于 2009-07-10T14:52:19.407 に答える
8

for each ループを使用して同じサイズの一時配列を作成し、個々の要素を double にキャストして配列に入れることができます。

それで:

double[] tempArray = new double[data[columnIndex].length];
int i = 0;
for(Double d : (Double) data[columnIndex]) {
  tempArray[i] = (double) d;
  i++;
}

ここで間違っている場合は修正してください。

于 2009-07-10T14:54:32.133 に答える
3

を返したい場合はdouble[]、 を作成してnew double[]入力し、それを返す必要があります。

それは良いアーキテクチャの決定かもしれません。Object[]まず、 anを aにキャストするのはあまり意味がありませんDouble[]Doubles も含まれている可能性があるため、実際には の配列ではありませObjectん。第 2 に、配列を直接返すと、ユーザー コードがそれを変更し、オブジェクトの内部構造を変更する可能性があります。

double[]パフォーマンスへの主な影響は、ボックス化解除と割り当てのコストにより、 の配列を返すことです。

于 2009-07-10T14:53:51.400 に答える
1

jjnguy と Eric Koslow が言ったこと以上に、本当の質問に追加することは何もありません。

ただし、補足として、 Object 配列を Double 配列にキャストすることについて言及しています。以下は機能しません。

Object[] oa=new Object[3];
oa[0]=new Double("1.0");
oa[1]=new Double("2.0");
oa[2]=new Double("3.0");
Double[] da=(Double[])oa;

最後の行は、クラス キャスト例外をスローします。配列内のすべての要素は確かに Double ですが、配列は Double の配列ではなく Object の配列として作成されているため、キャストは無効です。

于 2009-07-10T16:56:38.560 に答える
0

私は ArrayUtils の回答を2番目にし、1.5のオートボクシングのドキュメントvia)が組み込みの方法がないことを少し明らかにしていることを追加します:

SC から TC への文字列変換以外に変換が許可されていない場合、配列型 SC[] から配列型 TC[] への変換は許可されていません。

于 2009-07-10T16:33:36.360 に答える