나는 어떻게 변환 Double[]을 double[]?
-
12-09-2019 - |
문제
나는 인터페이스를 구현하는 기능이 비슷하는 테이블이 포함될 수 있습니다.인터페이스를 지정하는 다음과 같은 기능:
double[] getDoubles(int columnIndex);
내가 난처한 것은 나의 구현,나는 저장하는 테이블 데이터에서는 2D Object
array(Object[][] data
).가 필요할 때면 반환하는 값에,나는 다음을 수행할 수 있습니다(다고 가정한 getDoubles()
에만 호출됩니다에 포함하는 열 복식,그래서 거기에 없을 것입니다 ClassCastExceptions
):
double[] getDoubles(int columnIndex) {
return (double[]) data[columnIndex];
}
하지만 Java 허용하지 않는 Object[]
을 캐스팅 double[]
.으로 캐스팅 Double[]
ok 기 Double
객체지 기본지만,나의 인터페이스를 지정하는 데이터로 반환됩 double[]
.
그래서 나는 두 개의 질문:
- 는 방법이 있는지를 얻을 수 있는 열의 데이터
Object[][]
테이블익의 배열은 primitives? - 내가 할 경우는 변경의 인터페이스로 돌아
Double[]
, 없는 성능에 영향을 미칩니까?
해결책
불행히도 전체 목록을 통해 루프하고 Unbox Double
당신이 그것을 a로 변환하려면 double[]
.
성능이 진행되는 한 Java의 권투 및 Unboxing Primitive와 관련된 시간이 있습니다. 세트가 충분히 작 으면 성능 문제가 표시되지 않습니다.
다른 팁
타사 라이브러리를 사용하지 않는다면 Commons-Lang에는 다양한 조작 방법이있는 Arrayutils 유형이 있습니다.
Double[] doubles;
...
double[] d = ArrayUtils.toPrimitive(doubles);
보완적인 방법도 있습니다
doubles = ArrayUtils.toObject(d);
편집 : 나머지 질문에 대답합니다. 이 작업을 수행하는 데 약간의 오버 헤드가 있지만 배열이 실제로 크지 않으면 걱정하지 않아야합니다. 리팩토링 전에 문제인지 먼저 테스트하십시오.
실제로 요청한 방법을 구현하면 이와 같은 것을 줄 것입니다.
double[] getDoubles(int columnIndex) {
return ArrayUtils.toPrimitive(data[columnIndex]);
}
Java8,이 하이라이너:
Double[] boxed = new Double[] { 1.0, 2.0, 3.0 };
double[] unboxed = Stream.of(boxed).mapToDouble(Double::doubleValue).toArray();
참고로 이것은 여전히 반복하여 원래의 배열을 생성합니다.
각 루프마다 A를 사용하여 동일한 크기의 온도 배열을 구성한 다음 각 개별 요소를 두 배나 배열로 캐스팅 할 수 있습니다.
그래서:
double[] tempArray = new double[data[columnIndex].length];
int i = 0;
for(Double d : (Double) data[columnIndex]) {
tempArray[i] = (double) d;
i++;
}
내가 여기서 잘못 죽었다면 저를 바로 잡으십시오.
반환하고 싶다면 a double[]
, 당신은 a를 만들어야합니다 new double[]
, 그것을 채우고 그것을 돌려주십시오.
그것은 좋은 건축 결정 일 수 있습니다. 첫째, 캐스트하는 것은 의미가 없습니다. Object[]
a Double[]
; 실제로는 배열이 아닙니다 Double
있을 수 있기 때문에 Object
그것에도 s. 둘째, 배열을 직접 반환하면 사용자 코드가이를 수정하고 객체의 내부 구조를 변경할 수 있습니다.
주요 성능 영향은 배열을 반환하는 것입니다. double[]
, Unboxing 및 할당 비용으로 인해.
Jjnguy와 Eric 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;
마지막 줄은 클래스 캐스트 예외를 던집니다. 배열의 모든 요소가 실제로 이중이지만 배열은 더블 배열이 아닌 객체 배열로 생성되었으므로 캐스트는 유효하지 않습니다.
배열을 사용하여 변환 할 수 있습니다
Double[] d; // initialise
double[] array = ArrayUtils.toPrimitive(d);
전체 데이터를 반복 할 필요가 없습니다.