質問

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

double[] getDoubles(int columnIndex);

私の実装でつまづくのは、テーブルデータを 2D 形式で保存していることです。 Object 配列 (Object[][] data)。値を返す必要がある場合は、次のようにしたいと思います( getDoubles() double を含む列に対してのみ呼び出されるため、 ClassCastExceptions):

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

ただし、Java では許可されていません Object[] にキャストされる double[]. 。キャストする Double[] 大丈夫だから Double はオブジェクトでありプリミティブではありませんが、私のインターフェイスはデータがとして返されることを指定しています double[].

そこで 2 つの質問があります。

  1. 列データを取得する方法はありますか? Object[][] テーブルを呼び出してプリミティブの配列を返しますか?
  2. 戻るインターフェースを変更した場合 Double[], 、パフォーマンスへの影響はありますか?
役に立ちましたか?

解決

残念ながら、あなたはリスト全体をループする必要があり、Doubleに変換したい場合はdouble[]をVHS版になります。

限りのパフォーマンスが行くように、Javaでボクシングとアンボクシングプリミティブに関連したいくつかの時間があります。セットが十分に小さい場合は、任意のパフォーマンスの問題は表示されません。

他のヒント

あなたがサードパーティのライブラリを使用して気にしない場合は、

、コモンズ-langは操作のための様々な方法でArrayUtils入力しています。

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

補完的な方法でもあります。

doubles = ArrayUtils.toObject(d);

編集:質問の残りの部分に答えるために。そこにこれを行うにはいくつかのオーバーヘッドになりますが、配列は本当に大きなでない限り、あなたはそれを心配してはいけません。それはリファクタリングする前に、問題であるかどうかを確認するために最初にそれをテストします。

あなたが実際にこのような何かを与えるだろうについて尋ねていた方法を実装します。

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

は、Java 8では、これはワンライナーである

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

この静止元の配列を反復処理し、新しいものを作成することに注意してください。

あなたは配列内の同じサイズの一時配列を構築するために各ループのために使用、その後倍増する個々の要素をキャストし、それを可能性があります。

SOます:

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

私はここで死んで間違っているなら、私を修正してください。

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

これは良いアーキテクチャの決定かもしれません。まず、それは多くの意味がObject[]Double[]をキャストすることはありません。あまりにもそれにDoublesがあるかもしれないので、それは本当にObjectの配列ではありません。あなたは直接の配列を返す場合には、第2、ユーザーコードは、それを変更して、オブジェクトの内部構造を変更することができます。

メインパフォーマンスへの影響は、ボックス化解除および割り当てのコストに起因double[]の配列を返すであろう。

私が言ったことjjnguyとエリックKoslowを超えた本当の問題に追加する何かを持っていません。

しかし、単にサイドノート:あなたはダブル配列にオブジェクト配列をキャストに言及します。以下は動作しません。

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;

最後の行は、クラスのキャスト例外がスローされます。アレイ内のすべての要素が実際にダブルであっても、配列はオブジェクトの配列ではなく、ダブルスの配列として作成されたので、キャストが無効ですた。

あなたが変換することArrayUtilsを利用することができます。

Double[] d; // initialise
double[] array = ArrayUtils.toPrimitive(d);

全体のデータをループする必要はありません。

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

  

はTC []は全く許されていない場合は配列型に配列型SC []からの変換は許しません   SCからTC

への文字列変換以外の変換
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top