문제

나는 인터페이스를 구현하는 기능이 비슷하는 테이블이 포함될 수 있습니다.인터페이스를 지정하는 다음과 같은 기능:

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[].

그래서 나는 두 개의 질문:

  1. 는 방법이 있는지를 얻을 수 있는 열의 데이터 Object[][] 테이블익의 배열은 primitives?
  2. 내가 할 경우는 변경의 인터페이스로 돌아 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);

전체 데이터를 반복 할 필요가 없습니다.

두 번째로 배열이 대답하고 1.5를 추가합니다. 오토 옥스 문서(~을 통해) Kinda는 내장 된 방법이 없다는 것을 보여줍니다.

SC에서 TC로 문자열 변환 이외의 변환이 허용되지 않는 경우 배열 유형 SC []에서 배열 유형 TC []로 허용되는 변환이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top