2012-10-16 66 views
6

Tôi có một chương trình cho lớp Java của mình, nơi tôi muốn sử dụng hashSets để so sánh một thư mục tài liệu văn bản. Về cơ bản, kế hoạch của tôi là tạo một hashSet chuỗi cho mỗi bài báo, và sau đó thêm hai hashSets giấy tờ vào nhau thành một hashSet và tìm số lượng các chuỗi 6 từ giống nhau.Va chạm HashSet trong Java

Câu hỏi của tôi là, tôi có phải tự kiểm tra và xử lý, xung đột hoặc Java thực hiện điều đó cho tôi không?

+1

Bạn có thể tìm thấy ans [tại đây] (http://stackoverflow.com/questions/4980757/how-do-hashtables-deal-with-collisions) –

Trả lời

3

Bản đồ băm Java/bộ Tự động xử lý các xung đột Hash, đây là lý do tại sao điều quan trọng là ghi đè cả hai phương thức equalshashCode. Vì cả hai đều được sử dụng bởi Sets để phân biệt các mục nhập trùng lặp hoặc duy nhất. Một điều cũng quan trọng cần lưu ý là những va chạm băm này hava một hiệu suất impace vì nhiều đối tượng được tham chiếu bởi cùng một Hash.

public class MyObject { 
private String name; 

//getter and setters 


public int hashCode() { 
    int hashCode = //Do some object specifc stuff to gen hashCode 
    return int; 
} 

public boolean equals(Object obj) { 
    if(this==obj) return true; 
    if(obj instanceOf MyObject) { 
     if(this.name.equals((MyObject)obj.getName())) { 
      return true; 
     } 
    return false; 
} 
} 
} 

Lưu ý: Các đối tượng Java chuẩn như String đã triển khai hashCode và bằng để bạn chỉ phải thực hiện điều đó cho loại đối tượng dữ liệu của riêng bạn.

+0

Được rồi, tuyệt. Tôi đọc một số lượng công bằng của bài đăng những nơi nói rằng HashMaps đã được xây dựng trong va chạm xử lý, nhưng tôi không thể tìm thấy bất cứ điều gì mà cụ thể nói rằng HashSets đã được xây dựng trong va chạm xử lý. – marcinx27

+0

Xin lưu ý chỉnh sửa của tôi: điều quan trọng là ghi đè cả hai phương thức hashCode và equals, vì cả hai phương thức này đều được sử dụng bởi Sets để nhận dạng trùng lặp. – dngfng

+0

Ý của bạn là gì? – marcinx27

0

Tôi nghĩ bạn không yêu cầu các xung đột băm, phải không? Câu hỏi đặt ra là những gì xảy ra khi HashSet a và HashSet b được thêm vào một tập hợp đơn lẻ, ví dụ: bởi a.addAll (b).

Câu trả lời là một phần tử chứa tất cả các phần tử và không có bản sao. Trong trường hợp của chuỗi này có nghĩa là bạn có thể đếm số chuỗi bằng nhau từ các bộ với a.size() trước khi add - a.size() sau khi thêm + b.size().

Nó thậm chí không quan trọng nếu một số chuỗi có cùng mã băm nhưng không bằng nhau.

+0

Nó chỉ đúng nếu bạn thêm các đối tượng String vào Set hoặc các đối tượng khác đã thực hiện hashCode và bằng. Nếu bạn có đối tượng của riêng bạn, bạn chắc chắn sẽ phải thực hiện cả hai. – dngfng

+0

Loại. Những gì tôi nói là nếu tôi làm a.addAll (b), là nó chắc chắn rằng tôi sẽ không có bất kỳ bản sao và là nó chắc chắn rằng mỗi chuỗi duy nhất từ ​​a và b sẽ ở đó? – marcinx27

+0

@dngfng Vì vậy, nếu tôi đang sử dụng chuỗi, tôi không cần phải kiểm tra các xung đột. Tôi chỉ có thể đặt tất cả các chuỗi vào hashSets của họ và chắc chắn rằng tất cả mọi thứ duy nhất là ở đó, và rằng không có bản sao? – marcinx27

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