2011-10-23 10 views
9

Tôi có hai Mảng không rõ loại ... là có một cách để kiểm tra các yếu tố đều giống nhau:Java so sánh Mảng

public static boolean equals(Object a , Object b) { 
    if (a instanceof int[]) 
    return Arrays.equals((int[]) a, (int[])b); 
    if (a instanceof double[]){ 
    ////etc 
} 

Tôi muốn làm điều này mà không cần tất cả các kiểm tra instanceof ....

+0

gia tăng một số bộ phận khai báo method (public static ...) - nếu không nó tìm cho tôi như là phương pháp ruby ​​gọi với khối được thông qua :-) – Vladimir

Trả lời

16

ArrayUtils.isEquals() từ Apache Commons thực hiện chính xác điều đó. Nó cũng xử lý các mảng đa chiều.

+2

Có lợi ích gì khi sử dụng thư viện không phải lõi không? Nếu không tốt hơn là nên sử dụng Arrays.equals chuẩn thay thế. Tôi chỉ không muốn nhầm lẫn bất kỳ người nào tìm kiếm câu trả lời đã chọn. Nó cảm thấy tự nhiên hơn khi sử dụng phương thức chuẩn so với phương thức của Apache Commons. Tôi chọn Arrays.equals thay vì – Vladimir

+2

OK - có vẻ như vấn đề là với Arrays.equals và Arrays.deepEquals bạn không thể truyền mảng như đối tượng như trong ArrayUtils.isEquals - nhận nó ngay bây giờ. – Vladimir

11

Bạn nên cố gắng Arrays.deepEquals(a, b)

0

Nếu kiểu mảng là không rõ, bạn có thể không chỉ đơn giản là đúc để Object[], và do đó không thể sử dụng các phương pháp (equals, deepEquals) trong java.util.Arrays.
Tuy nhiên, bạn có thể sử dụng phản chiếu để có được độ dài và các mục của các mảng và so sánh chúng một cách đệ quy (các mục có thể là mảng).

Dưới đây là một phương pháp tiện ích chung để so sánh hai đối tượng (mảng cũng được hỗ trợ), cho phép một hoặc thậm chí cả hai để được null:

public static boolean equals (Object a, Object b) { 
    if (a == b) { 
     return true; 
    } 
    if (a == null || b == null) { 
     return false; 
    } 
    if (a.getClass().isArray() && b.getClass().isArray()) { 

     int length = Array.getLength(a); 
     if (length > 0 && !a.getClass().getComponentType().equals(b.getClass().getComponentType())) { 
      return false; 
     } 
     if (Array.getLength(b) != length) { 
      return false; 
     } 
     for (int i = 0; i < length; i++) { 
      if (!equals(Array.get(a, i), Array.get(b, i))) { 
       return false; 
      } 
     } 
     return true; 
    } 
    return a.equals(b); 
}