2011-11-30 28 views
22

Tôi có một số đối tượngArrayList của phương pháp Chứa

class A { 
    private Long id; 
    private String name; 
    public boolean equals(Long v) { 
    return this.id.equals(v); 
    } 
} 

và ArrayList của các đối tượng này. Điều tôi muốn là có thể kiểm tra xem danh sách đó có chứa một số đối tượng theo trường của đối tượng hay không. Ví dụ:

ArrayList<A> list = new ArrayList<A>(); if (list.contains(0L)) {...} 

nhưng ghi đè phương thức bằng không giúp tôi. Tôi đang làm gì sai? Cảm ơn bạn

CẬP NHẬT Và tôi cũng nên ghi đè phương thức hashcode()?

+0

bạn đã ghi đè bằng() trong lớp A? nếu có, bạn có thể đăng nó ở đây không? – c05mic

+0

Đánh giá bởi các câu trả lời dưới đây, tôi đoán không có giải pháp thuận tiện cho việc này. Tôi cảm thấy như thế này có thể được giải quyết với một lớp thực hiện ẩn danh, giống như loại bạn sử dụng khi gọi Collections.sort() với Comparator của riêng bạn. – kodu

+0

Sau khi tìm kiếm thêm một chút, tôi đã tìm thấy một số câu trả lời hữu ích tại đây: http://stackoverflow.com/questions/587404/finding-all-objects-that-have-a-given-property-inside-a-ollection – kodu

Trả lời

38

đây là một số mã có thể chứng minh như thế nào nó hoạt động ra:

import java.util.ArrayList; 

class A { 
    private Long id; 
    private String name; 

    A(Long id){ 
     this.id = id; 
    } 

    @Override 
    public boolean equals(Object v) { 
     boolean retVal = false; 

     if (v instanceof A){ 
      A ptr = (A) v; 
      retVal = ptr.id.longValue() == this.id; 
     } 

    return retVal; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 7; 
     hash = 17 * hash + (this.id != null ? this.id.hashCode() : 0); 
     return hash; 
    } 
} 

public class ArrayList_recap { 
    public static void main(String[] args) { 
     ArrayList<A> list = new ArrayList<A>(); 

     list.add(new A(0L)); 
     list.add(new A(1L)); 

     if (list.contains(new A(0L))) 
     { 
      System.out.println("Equal"); 
     } 
     else 
     { 
      System.out.println("Nah."); 
     }  
    } 

} 

Đầu tiên, có một ghi đè của phương pháp equals (Object o). Sau đó, có quá trình ghi đè hashCode(). Cũng lưu ý rằng instanceof Một kiểm tra trong bằng sẽ đảm bảo rằng bạn không cố gắng để so sánh các đối tượng khác nhau.

Điều đó sẽ thực hiện thủ thuật! Hy vọng nó đã giúp! Chúc mừng :)

+0

ví dụ tốt đẹp Cảm ơn! –

+0

Nó có hoạt động với phương pháp containsAll không? – Amriteya

+0

Nó hoạt động cho containsAll – Amriteya

8

Bạn chưa ghi đè phương thức trong lớp học của mình. Để ghi đè, các tham số phương thức cũng phải có cùng loại.

nó phải được

public boolean equals(Object o) { 

} 

nơi như trong trường hợp của bạn nó là

public boolean equals(Long o) { 

} 

bạn có thể cần phải làm điều này

public boolean equals(Object o) 
    { 
     if (o == null) return false; 
     if (o == this) return true; //if both pointing towards same object on heap 

      A a = (A) o; 
     return this.id.equals(a.id); 
    } 
+0

Tôi đã cập nhật mã, nhưng kết quả là như nhau. Chứa không thể tìm thấy một đối tượng có id cụ thể – nKognito

+0

bạn có thể vui lòng đăng mã có liên quan không. – Zohaib

+1

Xem câu trả lời của tôi cho một lời giải thích có thể - * "Vấn đề khác ..." * –

7

Những gì tôi đang làm sai?

Bạn không ghi đè. Bạn đang quá tải.

Phương thức contains gọi phương thức equals có chữ ký equals(Object), vì vậy phương thức (mới) mà bạn đã thêm sẽ không được gọi.

Vấn đề khác là phương pháp equals của bạn có ngữ nghĩa sai cho contains. Phương thức contains cần so sánh this với đối tượng có thể là thành viên của danh sách. Danh sách của bạn không chứa các đối tượng Long. Nó chứa các đối tượng thuộc loại A.

Bây giờ bạn có thể thoát khỏi điều này ... nếu bạn sử dụng các loại danh sách thô ... nhưng những gì bạn đang cố gắng làm là vi phạm hợp đồng API và thực hành không tốt. Một giải pháp tốt hơn là lặp lại và kiểm tra các phần tử của danh sách một cách rõ ràng.


Và tôi cũng nên ghi đè phương thức hashcode()?

Nếu bạn ghi đè equals(Object) sau đó bạn cũng nên ghi đè hashcode().

Nó sẽ không tạo ra bất kỳ sự khác biệt nào ở đây, nhưng điều quan trọng là nếu bạn đưa các đối tượng A vào cấu trúc dữ liệu được băm. Và vì bạn không biết những gì các chàng tiếp theo sẽ làm gì với mã của bạn, nó là thực hành tốt để đảm bảo rằng equals(Object)hashCode() có ngữ nghĩa tương thích.

+0

Cảm ơn bạn đã giải thích – nKognito

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