2010-02-20 25 views
11

Theo HashSet javadoc, HashSet.contains chỉ trả về một boolean. Làm thế nào tôi có thể "tìm" một đối tượng trong một hashSet và sửa đổi nó (nó không phải là một kiểu dữ liệu nguyên thủy)?cách tìm và trả về đối tượng trong hàm băm java

Tôi thấy rằng HashTable có phương thức get(), nhưng tôi muốn sử dụng bộ này.

+0

nhờ tất cả mọi người! Đối tượng của tôi thực sự chứa một danh sách liên kết tôi cần phải cập nhật thường xuyên, vì vậy tôi nghĩ rằng tôi sẽ chỉ đi với HashTable hơn là làm một lặp đi lặp lại đắt tiền cho mỗi cập nhật đối tượng. – user276712

Trả lời

11

Bạn có thể xóa phần tử và thêm phần tử khác.

Sửa đổi đối tượng trong khi nó nằm trong tập hợp băm là công thức cho thảm họa (nếu sửa đổi thay đổi giá trị băm hoặc hành vi bình đẳng).

+1

Điều này không hoàn toàn đúng. Sẽ an toàn khi sửa đổi phần tử HashSet nếu thay đổi không ảnh hưởng đến sự bình đẳng của đối tượng (và mã băm). Ví dụ: nếu bằng và hashCode không bị ghi đè, thì thay đổi sẽ an toàn để thực hiện vì sự bình đẳng của nó không bị thay đổi. –

+2

Có, và đó là lý do tại sao tôi đã viết một phần trong dấu ngoặc đơn. – starblue

2

Bạn có thể lặp qua bộ này để tìm đối tượng của mình.

Một lời cảnh báo từ API doc mặc dù:

"Lưu ý: Tuyệt vời chăm sóc phải được thực hiện nếu đối tượng có thể thay đổi được sử dụng như các yếu tố thiết lập Hành vi của một bộ không được chỉ định nếu giá trị của một đối tượng là. thay đổi theo cách ảnh hưởng đến bằng so sánh trong khi đối tượng là một phần tử trong tập hợp. "

+2

"Bạn có thể lặp lại ..." nhưng tất nhiên nếu bạn làm điều đó, việc cập nhật một phần tử đã trở thành một hoạt động 'O (N)'. –

12

Để trích dẫn nguồn của các cổ phiếu Sun java.util.HashSet:

public class HashSet<E> 
    extends AbstractSet<E> 
    implements Set<E>, Cloneable, java.io.Serializable 
{ 
    static final long serialVersionUID = -5024744406713321676L; 

    private transient HashMap<E,Object> map; 

Vì vậy, bạn đang trả tiền cho một bản đồ, bạn cũng có thể sử dụng nó.

+3

Tôi nghĩ bạn đang cố gắng nói "sử dụng HashMap" ... đúng không? :-) –

+5

Có. Xin lỗi, đôi khi tôi không thể chống lại sự thôi thúc để làm cho các câu đố nhỏ ra khỏi câu trả lời. – bmargulies

0
Object oldobj; //object to modify 
if (hashset.remove(oldobj)) { 
    Object newobj; //modified object 
    hashset.add(newobj); 
} 
0

Cái gì như:

MyObject obj = new MyObject(); 
HashSet hashSet = new HashSet(); 
hashSet.add(obj); 

if (hashSet.contains(obj) == true) { 
    hashSet.remove(obj); 
    obj.setSomething(); 
    hashSet.add(obj); 
} 
+3

1. '== true' - là không cần thiết 2. bạn chưa kiểm tra giá trị trả lại của' .remove (obj) ' 3.' .contains() 'là không cần thiết nếu bạn xóa ở bước tiếp theo –

+1

Xem xét sự thật tất cả là đúng, bạn không nên quá cầu kỳ :) – kovica

-1

tôi gặp phải cùng một vấn đề và đưa ra các giải pháp sau đây (nó nên thực hiện các giao diện Set nhưng không phải tất cả các phương pháp đang ở đây)

public class MySet<T> implements Set<T>{ 

    private HashMap<T,T> items = new HashMap<T,T>(); 


    public boolean contains(Object item) 
    { 
     return items.containsKey(item); 
    } 

    public boolean add(T item) 
    { 
     if (items.containsKey(item)) 
      return false; 
     else 
     { 
      items.put(item, item); 
      return true; 
     } 
    } 

    public T get(T item) 
    { 
     return items.get(item); 
    } 
} 
+1

Không cần phải ủy quyền. Đơn giản chỉ cần sử dụng HashMap thay vì HashSet. – mostruash

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