2013-07-01 54 views
5

Tôi đang viết một hàm để tổng hợp hai mảng (không nhất thiết là kích thước bằng nhau) trong Java và trả về kết quả.Làm thế nào để tổng hợp các mảng trong Java

Đây là nỗ lực của tôi:

public static <T> T[] sumArrays(T[] lhs, T[] rhs) 
    { 
     T[] out = new T[Math.max(lhs.length, rhs.length)]; 

     for (int i = 0; i < Math.max(lhs.length, rhs.length); ++i){    
      if (i < Math.min(lhs.length, rhs.length)){ 
       out[i] = lhs[i] + rhs[i];     
      } else if (i < lhs.length){ 
       out[i] = lhs[i]; 
      } else /* if (i < rhs.length)*/{ 
       out[i] = rhs[i]; 
      }    
     } 
     return out;   
    } 

Nhưng tôi có một vài nhận xét mặc dù các lỗi biên dịch.

  1. Tại sao chức năng này không nằm trong thư viện Java, vốn cực kỳ lớn?

  2. Tôi được thúc đẩy sử dụng Generics, vì bạn sẽ sử dụng các mẫu trong C++.

  3. Tôi lo lắng về việc nhận được bản sao sâu của dữ liệu đầu vào; lhs và `` rhs. Bất cứ ai có thể trấn an tôi về điều này? C++ cho phép tôi vượt qua một tham chiếu liên tục; và tôi chắc chắn sẽ biết.

  4. Sự khởi tạo của T[] có vẻ không hợp lệ với loại chung. Tôi đang thiếu gì?

  5. Trình biên dịch có tối ưu hóa số lặp lại Math.max(lhs.length, rhs.length) của tôi không?

  6. Trình biên dịch không thích lhs[i] + rhs[i]. Có lẽ bởi vì nó không biết loại T, nhưng C++ cho phép bạn làm điều này vì nó sẽ không cố gắng biên dịch một khuôn mẫu cho đến khi nó biết loại.

6) Bạn sẽ lấy một bản sao ra khi quay lại? Một lần nữa, trình biên dịch C++ sẽ không lấy thêm một bản sao.

Có lẽ tôi đã quá già để làm quen với Java ;-)

+0

Quảng cáo 3) http://javadude.com/articles/passbyvalue.htm –

+0

Thêm nội dung của hai mảng có độ dài không đồng đều không phải là một điểm chung hoạt động, tôi chưa bao giờ thực hiện nó. Nếu đó là sau đó những gì về chia hai mảng, trừ hai mảng, nâng cao một mục từ một mảng đến sức mạnh của vv vv vv khác Java cung cấp cho bạn các công cụ để làm điều đó nếu bạn cần nó –

+1

'T' là không rõ tại thời gian chạy đó là lý do tại sao bạn không thể thực hiện 'new T []' – blank

Trả lời

8

0) Tại sao không phải là chức năng này trong thư viện Java cực kỳ khổng lồ?

Hỏi ý kiến, đề tài ở đây.

2) Tôi lo lắng về việc nhận được bản sao sâu của dữ liệu đầu vào; lhs và rhs. Bất cứ ai có thể trấn an tôi về điều này? C++ cho phép tôi vượt qua một tham chiếu liên tục; và tôi chắc chắn sẽ biết.

6) Bạn có muốn lấy một bản sao ra ngoài khi quay lại không? Một lần nữa, trình biên dịch C++ sẽ không lấy thêm một bản sao.

Không sao chép sâu được tự động thực hiện trong Java. Hơn nữa, việc sao chép sâu là một vấn đề không rõ ràng nói chung.

3) Sự khởi tạo của T[] có vẻ không hợp lệ với loại chung. Tôi đang thiếu gì?

Ngoài việc không thể khởi tạo một loạt loại chung, loại chung chỉ bao gồm các loại tham chiếu. Bạn có thể chỉ quan tâm đến các kiểu nguyên thủy ở đây, vì vậy chúng không được sử dụng.

4) Trình biên dịch có tối ưu hóa số lặp lại Math.max(lhs.length, rhs.length) của tôi không?

Một số JIT có thể, nhưng bạn không thể có bất kỳ loại bảo đảm nào. Giải nén vào một biến cục bộ.

5) Trình biên dịch không thích lhs[i] + rhs[i]. Có lẽ vì nó không biết loại T, nhưng C++ cho phép bạn làm điều này vì nó sẽ không cố gắng biên dịch mẫu cho đến khi nó biết loại.

Thật không may, bạn đang gặp nhiều rắc rối ở đây. Không có cách nào để mở rộng các thuật toán cho tất cả các kiểu Java nguyên thủy.

+0

Hum, nhưng +1. Nó không được hiểu như một lời chỉ trích vì Java nợ sự thanh lịch của nó trong việc xem xét làm thế nào để cải thiện các ngôn ngữ khác, nhưng ở trên có thể dễ dàng hoàn thành trong C++ bằng cách sử dụng các mẫu. Tôi đoán tôi nên xây dựng một phiên bản bằng cách sử dụng gấp đôi thay cho T. – Bathsheba

+0

@Bathsheba Trong C++ điều gì sẽ xảy ra nếu bạn cố gắng (ví dụ) thêm một bóng rổ để annother bóng rổ? Khi viết mã của bạn cho phép điều này (nếu trình biên dịch không phản đối) –

+2

Các mẫu C++ được khởi tạo tại thời gian biên dịch với các kiểu cụ thể, vì vậy chúng có ít tiền để làm với Java Generics. Có, JG là một tính năng khá khập khiễng của Java, có tỷ lệ lực đẩy-to-weight khủng khiếp, và đã nhận được rất nhiều lời chỉ trích về hiệu ứng đó. –

1

5) Trình biên dịch không giống như lhs [i] + rhs [i]. Có lẽ bởi vì nó không biết loại T, nhưng C++ cho phép bạn làm điều này vì nó sẽ không cố gắng biên dịch mẫu cho đến khi nó biết loại.

Bạn luôn có thể viết giao diện có hàm .add (...) và để T mở rộng giao diện này. Sau đó, bạn có thể viết lhs [i] .add (rhs [i])

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