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[]
.
그래서 두 가지 질문이 있습니다.
Object[][]
테이블 에서 열 데이터를 가져 오고 기본 배열을 반환 할 수있는 방법이 있습니까?- 반환하도록 인터페이스를 변경하면
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
'developer tip' 카테고리의 다른 글
Amazon EC2에서 시간대를 설정하는 방법은 무엇입니까? (0) | 2020.11.26 |
---|---|
치명적인 오류 : 포착되지 않은 오류 : 정의되지 않은 함수 mysql_connect () 호출 (0) | 2020.11.26 |
JavaScript에서 배열이 존재하는지 확인하는 방법은 무엇입니까? (0) | 2020.11.26 |
Mercurial에서 hg 되돌리기 사용 (0) | 2020.11.26 |
WebDriver로 요소가 표시되는지 확인하는 방법 (0) | 2020.11.26 |