2010-01-07 42 views
18

Tôi có một mảng nổi và tôi muốn chuyển đổi nó thành một mảng đôi trong Java. Tôi nhận thức được cách rõ ràng của việc lặp qua mảng và tạo một mảng mới. Tôi mong đợi Java tiêu hóa một float [] suôn sẻ nơi nó muốn làm việc với double [] ... nhưng nó không thể làm việc với điều này. Cách hiệu quả, thanh lịch để thực hiện chuyển đổi này là gì?Làm thế nào để chuyển đổi mảng nổi để mảng của đôi trong Java?

+1

Không có cách nào để "thanh lịch" làm điều này bởi vì phao và đôi là các kiểu dữ liệu hoàn toàn khác nhau theo kích thước và mẫu bit. Vì vậy, cách rõ ràng là người duy nhất. –

Trả lời

30

Về cơ bản nội dung nào đó phải thực hiện chuyển đổi từng giá trị. Không có chuyển đổi ngầm giữa hai loại mảng vì mã được sử dụng để xử lý chúng sau khi JITting sẽ khác nhau - chúng có kích thước phần tử khác nhau và float sẽ cần một chuyển đổi trong khi double sẽ không. So sánh điều này với mảng hiệp phương sai cho các kiểu tham chiếu, khi không có chuyển đổi được yêu cầu khi đọc dữ liệu (ví dụ mẫu bit giống nhau cho tham chiếu chuỗi như tham chiếu đối tượng) và kích thước phần tử giống nhau cho tất cả các loại tham chiếu.

Tóm lại, một cái gì đó sẽ phải thực hiện chuyển đổi trong một vòng lặp. Tôi không biết bất kỳ phương pháp tích hợp nào để thực hiện việc này. Tôi chắc chắn rằng họ tồn tại trong thư viện của bên thứ ba ở đâu đó, nhưng trừ khi bạn tình cờ sử dụng một trong những thư viện đó, tôi chỉ viết phương pháp của riêng bạn. Để thuận tiện, dưới đây là triển khai mẫu:

public static double[] convertFloatsToDoubles(float[] input) 
{ 
    if (input == null) 
    { 
     return null; // Or throw an exception - your choice 
    } 
    double[] output = new double[input.length]; 
    for (int i = 0; i < input.length; i++) 
    { 
     output[i] = input[i]; 
    } 
    return output; 
} 
+0

Bạn có thể làm cho nó một phương pháp mở rộng quá. – Seth

+3

@Seth: Đây là Java chứ không phải C#. –

+0

Bạn có thể đặt tên cho nó là 'convertToDoubles' hoặc' toDoubles' và cung cấp quá tải cho các kiểu nguyên thủy (và đóng hộp) khác. –

1

Bạn có thực sự cần sao chép mảng nổi của mình thành mảng kép không? Nếu bạn đang gặp rắc rối với trình biên dịch và các loại khi sử dụng phao bạn có thể sử dụng ...

float x = 0; 
double d = Double.valueOf(x); 

Bạn có được lợi thế gì khi lấy một bản sao? Nếu bạn cần độ chính xác cao hơn trong các kết quả tính toán dựa trên các phao nổi thì thực hiện các kết quả double. Tôi có thể thấy khá nhiều nhược điểm để có một bản sao của mảng, và thực hiện chức năng sao chép, đặc biệt là nếu nó là lớn. Hãy chắc chắn rằng bạn thực sự cần phải làm điều đó.

HTH

+1

Tôi thấy một lý do rất rõ ràng: gọi một phương thức cần một 'double []' trong khi bạn có dữ liệu trong 'float []'. –

+0

rõ ràng, nhưng OP không đề cập đến điều đó. Tôi chỉ muốn đưa ra một giải pháp thay thế kể từ khi anh ấy yêu cầu. – Simon

+0

Andreas_D giải thích nó. Tôi cần làm hai thư viện để chơi với nhau. Một trong số đó làm việc với các vectơ [] kép, cái kia có float [] (vectơ theo nghĩa toán học). Java rắc rối với mảng đúc, phù hợp với các thư viện này không phải là đơn giản. Dường như không tồn tại bất kỳ giải pháp nào mà không cần lặp lại mảng. Cảm ơn vi đa trả lơi. – fifigyuri

7

Trong Java 8 bạn có thể, nếu bạn thực sự muốn, làm:

IntStream.range(0, floatArray.length).mapToDouble(i -> floatArray[i]).toArray(); 

Nhưng nó tốt hơn (sạch hơn, nhanh hơn, ngữ nghĩa tốt hơn) để sử dụng chức năng Jon Skeet.

+0

Tôi không mua Jon Skeet là tốt hơn. Trong thực tế, điều này có thể được tối ưu hóa nhanh hơn và thực hiện song song.Đó là rõ ràng những gì đang xảy ra và cũng có thể được chuyển thành tương đương chức năng của (double []) floatArray. Lý do để sử dụng các luồng là để nó cho trình biên dịch biết chúng ta không quan tâm nó được thực hiện như thế nào hoặc theo thứ tự nào, chỉ cần ánh xạ tất cả các giá trị này tới các giá trị khác. Thay vì lặp qua chúng bên ngoài. – Tatarize

Các vấn đề liên quan