Chắc chắn. Bất kỳ cấu trúc dữ liệu nào cũng có thể được băm. Bạn chỉ cần đưa ra một định nghĩa nghiêm ngặt về bình đẳng và sau đó đảm bảo rằng băm (A) == băm (B) nếu A == B. Giả sử định nghĩa của bạn là [s1, s2, ..., sm] == [t1, t2, ..., tn] nếu và chỉ nếu m == n và si == ti cho i = 1..m và chuỗi tiếp theo s == t nếu và chỉ khi | s | == | t | và s [i] == t [i] cho 0 < = i < | s |. Bạn có thể tạo một băm theo nhiều cách:
- Ghép tất cả các chuỗi trong danh sách và băm kết quả bằng bất kỳ hàm băm chuỗi nào.
- Làm tương tự, thêm dấu tách như dấu phẩy (,)
- băm từng chuỗi riêng lẻ và xor kết quả.
- Chuỗi chữ thập eash riêng lẻ, thay đổi giá trị băm trước đó và xor giá trị mới vào băm.
- Nhiều khả năng hơn nữa ...
Định nghĩa về sự bình đẳng là quan trọng. Nếu ví dụ thứ tự không quan trọng trong danh sách hoặc so sánh chuỗi không phân biệt dạng chữ, thì hàm băm phải được thiết kế để đảm bảo hàm băm (A) == băm (B) nếu A == B. Bắt sai này sẽ khiến tra cứu thất bại.
Java là một ngôn ngữ cho phép bạn xác định hàm băm cho bất kỳ loại dữ liệu nào. Và trên thực tế, một danh sách thư viện các chuỗi sẽ hoạt động tốt như một khóa sử dụng hàm băm mặc định.
HashMap<ArrayList<String>, String> map = new HashMap<ArrayList<String>, String>();
ArrayList<String> key = new ArrayList<String>();
key.add("Hello");
key.add("World");
map.put(key, "It's me.");
// map now contains mapping ["Hello", "World"] -> "It's me."
bạn có thể nối các phần tử của danh sách và sử dụng chức năng chuỗi dựa trên – Eduardo
Có, nhưng nó không phải là khuyến khích vì mảng là chìa khóa có thể thay đổi và có thể thay đổi trong băm/dicts/bản đồ có thể gây ra lỗi runtime lạ. –
@AbhinavSarkar Tôi không nghĩ rằng vấn đề sẽ là sự biến đổi. Trong Java miễn là bạn có thể thực hiện hashCode và bằng đối tượng của bạn nên là chìa khóa xứng đáng. Vì vậy, bạn có thể sử dụng ArrayList làm khóa, miễn là hashCode/equals của bạn đảm bảo kết quả bạn mong đợi. – gebuh