developer tip

Double []을 double []로 어떻게 변환합니까?

optionbox 2020. 11. 26. 08:12
반응형

Double []을 double []로 어떻게 변환합니까?


개체 유형을 포함 할 수있는 테이블과 유사한 기능을 가진 인터페이스를 구현하고 있습니다. 인터페이스는 다음 기능을 지정합니다.

double[] getDoubles(int columnIndex);

내가 난처한 부분은 내 구현에서 테이블 데이터를 2D Object배열 ( Object[][] data) 에 저장하고 있다는 것 입니다. 값을 반환해야 할 때 다음을 수행하고 싶습니다 ( getDoubles()복식이 포함 된 열에서만 호출되는 것으로 가정 하므로은 없습니다 ClassCastExceptions).

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

그러나 Object[]-Java는 double[]. 은 기본 요소가 아닌 객체 Double[]이기 때문에 캐스트하는 것은 Double좋지만 내 인터페이스는 데이터가 double[].

그래서 두 가지 질문이 있습니다.

  1. Object[][]테이블 에서 열 데이터를 가져 오고 기본 배열을 반환 할 수있는 방법이 있습니까?
  2. 반환하도록 인터페이스를 변경하면 Double[]성능에 영향이 있습니까?

불행히도 전체 목록을 반복 Double하고 double[].

성능에 관한 한 Java에서 기본 요소를 boxing 및 unboxing하는 것과 관련된 시간이 있습니다. 세트가 충분히 작 으면 성능 문제가 발생하지 않습니다.


타사 라이브러리를 사용해도 괜찮다면 commons-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();

이것은 여전히 ​​원래 배열을 반복하고 새 배열을 만듭니다.


for each 루프를 사용하여 동일한 크기의 임시 배열을 생성 한 다음 각 개별 요소를 double로 캐스트 할 수 있지만 배열에 있습니다.

그래서:

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

내가 여기서 틀렸다면 나를 바로 잡으십시오.


를 반환 double[]하려면을 만들고 new double[]채우고 반환해야합니다.

그것은 좋은 아키텍처 결정일 수 있습니다. 첫째, an Object[]을 a 로 캐스트하는 것은 의미가 없습니다 Double[]. s도 Double있을 수 있기 때문에 실제로는 배열이 아닙니다 Object. 둘째, 배열을 직접 반환하면 사용자 코드가 배열을 수정하고 객체의 내부 구조를 변경할 수 있습니다.

주요 성능 영향은 double[]unboxing 및 할당 비용으로 인해 의 배열을 반환하는 것 입니다.


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;

The last line will throw a class cast exception. Even though every element in the array is indeed a Double, the array was created as an array of Objects, not an array of Doubles, so the cast is invalid.


You can utilise the ArrayUtils to convert

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

No need of looping the entire data.


I would second the ArrayUtils answer and add that the 1.5 autoboxing documentation(via) kinda reveals that there is no builtin way:

There is no permitted conversion from array type SC[] to array type TC[] if there is no permitted conversion other than a string conversion from SC to TC

참고URL : https://stackoverflow.com/questions/1109988/how-do-i-convert-double-to-double

반응형