2012-12-08 41 views
5

Tôi mới sử dụng Java và tôi đang cố gắng tìm hiểu về các bảng băm. Tôi muốn chèn các đối tượng vào bảng băm của tôi và sau đó có thể in tất cả các đối tượng từ bảng băm ở cuối. Tôi không chắc chắn tôi đang làm điều này đúng bởi vì tôi đã đọc mà tôi cần phải ghi đè lên get() phương pháp hoặc phương pháp hashCode() nhưng tôi không chắc chắn lý do tại sao.Bảng băm Java chèn

Tôi đang chuyển trong các đối tượng String của tên sinh viên. Khi tôi chạy trình gỡ lỗi sau khi chèn, nó cho thấy khóa là "null" và các chỉ mục của các chèn của tôi là ở các vị trí ngẫu nhiên trong bảng băm. Ví dụ 1, 6, 10

Đây là cách tôi đã thêm. Bất cứ ai có thể cho tôi biết nếu điều này là chính xác và tôi thực sự cần phải ghi đè lên mọi thứ?

Cảm ơn trước!

Hashtable<String,String> hashTable=new Hashtable<String,String>(); 
hashTable.put("Donald", "Trump"); 
hashTable.put("Mike", "Myers"); 
hashTable.put ("Jimmer", "Markus"); 
+0

Đó có vẻ tốt đẹp. Những gì bạn nhìn thấy trong trình gỡ rối là chi tiết thực hiện nitty-gritty của mảng sao lưu và vân vân. Bạn không thực sự giả sử để xem xét điều đó trừ khi bạn tò mò. –

+0

@GregS Cảm ơn Greg vì đã trả lời nhanh. nếu tôi sử dụng một đối tượng sinh viên cho chèn thay vì chỉ là một đối tượng String, tôi sẽ phải ghi đè lên mọi thứ? Bạn có phiền cho tôi thấy làm thế nào tôi có thể thực hiện một điều như vậy? Nhờ bạn và mọi người đã giúp đỡ bạn –

Trả lời

4

Bạn đang làm việc một cách chính xác. Hãy nhớ rằng, Hashtable không phải là cấu trúc truy cập trực tiếp. Bạn không thể "lấy mục thứ ba từ ví dụ Hashtable". Không có ý nghĩa thực sự với thuật ngữ "chỉ mục" khi bạn đang nói về một Hashtable: các chỉ mục số của các mục có nghĩa là không có gì.

Một Hashtable đảm bảo rằng nó sẽ giữ cặp khóa-giá trị cho bạn, trong một cách mà nó sẽ được rất nhanh để kết luận một giá trị dựa trên một chìa khóa (ví dụ: cho Donald, bạn sẽ nhận được Trump rất nhanh chóng). Tất nhiên, một số điều kiện nhất định phải được thực hiện để nó hoạt động đúng, nhưng đối với ví dụ String-to-String đơn giản của bạn, nó hoạt động.

Bạn nên đọc thêm về bảng băm nói chung, để xem cách chúng thực sự hoạt động sau hậu trường.

EDIT (theo yêu cầu của OP): bạn đang hỏi về việc lưu trữ Student trường hợp trong Hashtable của bạn. Như tôi đã đề cập ở trên, một số điều kiện nhất định phải được giải quyết cho một Hashtable hoạt động chính xác. Các điều kiện đó liên quan đến khóa khóa, không phải là giá trị .

Nếu dụ Student của bạn là giá trị, và một chuỗi đơn giản là chính, sau đó không có gì đặc biệt để bạn có thể làm, bởi vì chuỗi nguyên thủy đã trả lời tất cả các điều kiện cần thiết cho một chìa khóa Hashtable thích hợp.

Nếu dụ Student của bạn là chính, sau đó các điều kiện sau đây phải được đáp ứng:

  1. Bên Student, bạn phải ghi đè lên các phương pháp hashCode theo cách như vậy mà lời gọi tiếp theo của hashCode sẽ trở lại chính xác cùng một giá trị. Nói cách khác, biểu thức x.hashCode() == x.hashCode() phải luôn là là đúng.

  2. Bên Student, bạn phải ghi đè lên các phương pháp equals theo một cách như vậy mà nó sẽ chỉ trả lại true cho hai trường hợp giống hệt nhau của Student, và trở false khác.

Các điều kiện này đủ cho Student để hoạt động như một khóa Hashtable thích hợp. Bạn có thể tiếp tục tối ưu hóa mọi thứ bằng cách viết một bài thực hành tốt hơn hashCode (đọc về nó ... nó khá dài để gõ vào đây), nhưng miễn là bạn trả lời hai câu nói trên, bạn tốt để đi.

Ví dụ:

class Student { 
    private String name; 
    private String address; 

    public int hashCode() { 
     // Assuming 'name' and 'address' are not null, for simplification here. 

     return name.hashCode() + address.hashCode(); 
    } 

    public boolean equals (Object other) { 
     if (!(other instanceof Student) { 
      return false; 
     } 
     if (other == this) { 
      return true; 
     } 

     Student otherStudent = (Student) other; 
     return name.equals(otherStudent.name) && address.equals(otherStudent.address); 
    } 
} 
+0

xin lỗi một câu hỏi cuối cùng ... Vì tôi ghi đè, tôi không cần sử dụng "@"? Cảm ơn một lần nữa! –

+1

Có, bạn có thể sử dụng '@ Ghi đè'. Nó thực sự khuyên bạn nên làm. Tôi chỉ đơn giản hóa ở đây. – Isaac

0

Hãy thử mã này:

Hashtable<String,String> hashTable=new Hashtable<String,String>(); 

hashTable.put("Donald", "16 years old"); 
hashTable.put("Mike", "20 years old"); 
hashTable.put ("Jimmer", "18 years old"); 

Enumeration studentsNames; 
String str; 


// Show all students in hash table. 
studentsNames = hashTable.keys(); 
while(studentsNames.hasMoreElements()) { 
str = (String) studentsNames.nextElement(); 
txt.append("\n"+str + ": " + hashTable.get(str)); 
}