2012-03-14 40 views

Trả lời

18

Thật không may là cách duy nhất để truyền mảng của bạn là lặp qua từng phần tử và đúc từng phần tử trong khi chèn lại trong mảng double[][] mới của bạn.

Không có phím tắt.

+1

Bạn có chắc chắn ... ??? – Lion

+4

Vâng. Nguồn của tôi là nghiên cứu của riêng tôi về chủ đề này. ;) Googling xung quanh sẽ đưa bạn đến cùng một kết luận. – Vache

+0

+1. Đây là cách duy nhất. Thỏa thuận. –

0

Bạn không thể truyền chúng, đôi được đặt ra khác nhau trong bộ nhớ so với ints, đây không phải là trường hợp đơn giản thay đổi tên của chúng.

CHỈNH SỬA: Chỉ khi double là lớp siêu hoặc lớp con của int thì có thể có thể.

+0

Đó không phải là một câu trả lời rất hữu ích. Ngay cả khi được đặt ra giống nhau (ví dụ: cả 32 bit), bạn vẫn không thể truyền chúng. Hệ thống kiểu Java đơn giản là không cho phép nó. – Jochen

+0

Tôi đoán những gì tôi cố gắng để vượt qua là một trong những không phải là một phân lớp của người khác, do đó, đúc không có ý nghĩa. Thực tế là họ 32bits không ngụ ý rằng họ được đặt ra như nhau. Nhưng tôi thấy quan điểm của bạn. – Sandro

2

Không, đó không phải là cách nhập chính xác. int [] là một kiểu và double [] là một kiểu và chúng không có quan hệ, do đó các phép gán như vậy không được phép. Vì vậy, không có cách nào để đúc này.

Bạn sẽ phải sao chép các phần tử (bạn có thể chỉ định một phần tử int mà không cần truyền).

0

Bạn có thể làm điều đó như thế này:

int[][] intarray = {{1, 2}, {5, 6}}; 

    double[][] doublearray = new double[intarray.length][intarray[0].length]; 

    for(int i = 0; i < intarray.length; i++) 
    { 
     for(int j = 0; j < intarray[0].length; j++) 
      doublearray[i][j] = (double) intarray[i][j]; 
    } 

Chỉnh sửa: như Andreas_D chỉ ra, điều này chỉ hoạt động nếu tất cả các hàng là các chiều dài tương tự, nếu bạn muốn chiều dài thay đổi, bạn sẽ phải đi qua thứ hai cho vòng lặp cho một số lượng biến cột.

+4

Điều này chỉ hoạt động nếu tất cả các hàng có cùng độ dài. –

+0

Bạn không thực sự cần phải làm việc đúc mặc dù, vì vậy bạn có thể omitt "(đôi)". @Andreas; Vâng. – Martin

0

Hmm, là mã của tôi được viết bằng Java 8 có giá trị được gọi là phím tắt?

import java.util.Arrays; 

// ... 

/// Cast! 
int[][] int2DArray = {{3, 1}, {3, 3, 7}, {}}; 
Object[] arrayOfUntypedArraies = Arrays.stream(int2DArray).map(intArray -> Arrays.stream(intArray).asDoubleStream().toArray()).toArray(); 
double[][] double2DArray = Arrays.copyOf(arrayOfUntypedArraies, arrayOfUntypedArraies.length, double[][].class); 

/// Print! 
System.out.println(Arrays.deepToString(int2DArray)); 
// [[1, 2], [5, 6, 7], []] 
System.out.println(Arrays.deepToString(double2DArray)); 
// [[1.0, 2.0], [5.0, 6.0, 7.0], []] 
0

Trong Java 8 bạn có thể cast một mảng 1 chiều của int s vào một mảng của double s:

double[] singleDimensionDoubleArray = 
     Arrays.stream(singleDimensionIntArray).asDoubleStream().toArray() 

do đó tôi đã viết những gì tôi cho rằng sẽ là một phiên bản nhanh hơn bằng cách lặp qua hàng:

int[][] iArray = { 
    {1, 2,}, 
    {5, 6,} 
}; 

double[][] dArray = new double[iArray.length][]; 
for (int row = 0; row < iArray.length; row++) { 
    dArray[row] = Arrays.stream(iArray[row]).asDoubleStream().toArray(); 
} 

Tôi vừa mới đăng câu trả lời này nhưng nghĩ rằng tôi sẽ đăng một số chỉ số về tốc độ lặp đi lặp lại một cách ngây thơ trên mọi phần tử. Hóa ra là khoảng 10x chậm hơn! Tôi đã thử nghiệm nó với một mảng 10000x1000 của số không. Tôi cho rằng đó là sự tạo ra vật thể thêm gây ra sự chậm lại.

Trừ khi người khác có thể chứng minh điều ngược, tôi nghĩ rằng giải pháp đơn giản nhất thực sự là nhanh nhất:

for (int row = 0; row < iArray.length; row++) { 
    for (int column = 0; column < iArray[0].length; column++) { 
     dArray[row][column] = (double) iArray[row][column]; 
    } 
} 
Các vấn đề liên quan