So sánh hashmap vs treemap trong java

Các entry trong HashMap không được sắp xếp theo thứ tự. Nhưng nếu bạn bị yêu cầu phải sắp xếp thì bạn hoàn toàn có thể làm được.

Sắp xếp HashMap dựa trên các Keys khá là dễ. Chúng ta có 2 cách làm.

Cách 1: Dùng TreeMap [ưu tiên dùng cách này]

Việc bạn cần làm là tạo ra một TreeMap bằng cách sao chép các entries từ HashMap.

TreeMap là một implementation của SortedMap. Vì vậy nó sẽ sắp xếp theo natural ordering hoặc bạn hoàn toàn có thể custom việc sắp xếp theo ý bạn bằng cách dùng Comparator.

Cách 2: Dùng LinkedHashMap

Cách này hơi dài dòng chút. Đầu tiên bạn cần lấy ra một Set các keys. Convert Set đó thành List. Sắp xếp List đó, và rồi add chúng lại LinkedHashMap theo đúng thứ tự đã sắp xếp.

2. Sắp xếp HashMap dựa trên Value

Sắp xếp dựa trên Value khá phức tạp vì không có phương pháp trực tiếp hỗ trợ việc này. Bạn buộc phải viết code cho nó. Đầu tiên bạn phải tạo ra một Comparator để so sánh hai entries dựa trên value. Sau đó lấy Set of entries từ Map, convert Set thành List và dùng phương thức Collections.sort[List] để sắp xếp List các entries bằng value bằng cách truyền vào customized value comparator. Việc này tương tự như Làm thế nào để sắp xếp một ArrayList trong Java?

Cuối cùng, chúng ta tạo ra một LinkedHashMap, đây là một lớp extend từ HashMap và add các entries đã được sắp xếp vào đó. LinkedHashMap sẽ đảm bảo các phần tử được chèn vào theo một thứ tự 😉

Trong 1 số ngôn ngữ lập trình, Map được gọi là Dictionary [như Python hay C#]. Trong khuôn khổ bài viết này, mình dùng từ map do thông thạo với C++ và Java.

Các cấu trúc dữ liệu như mảng hay xâu kí tự, khi truy xuất dữ liệu bạn sẽ sử dụng một tham số gọi là chỉ số, ví dụ như arr[1], str[2], … Đối với cấu trúc dữ liệu map, để truy xuất dữ liệu bạn sẽ sử dụng một tham số gọi là key

Cấu trúc dữ liệu kiểu map là một cấu trúc dữ liệu ánh xạ giữa cái gọi là khoá [key] sang giá trị của khoá đó [gọi là value]

Trong cấu trúc dữ liệu này, mỗi một key sẽ nhận một giá trị khác nhau.

Ứng dụng

Ứng dụng của map có rất nhiều. Mình đưa ra 1 số bài toán cơ bản nhé:

  • Cho một danh sách các số điện thoại kèm theo tên của chủ thuê bao đó. Yêu cầu đầu vào là một số điện thoại [key], hãy đưa ra tên của chủ thuê bao [value]
  • Cho danh sách thể hiện lịch sử đi muộn của các nhân viên một công ty nào đó. Hãy tìm xem nhân viên [key] nào có số lần đi muộn [value] nhiều nhất?
  • Cho một danh sách các IP kèm theo các domain. Hãy trả ra ip [value] tương ứng domain [key] hoặc ngược lại trong thời gian nhanh nhất?

Với các bài toán này, bạn có thể sử dụng 2 mảng dữ liệu có cùng độ dài. Một mảng bạn lưu danh sách key, một mảng bạn lưu danh sách các value tương ứng với key đó [cùng chỉ số truy cập mảng]. Khi bạn cần tìm value của một key nào đó, bạn duyệt mảng key, tìm chỉ số của phần tử trong mảng có giá trị bằng key cần tìm rồi trả ra giá trị tương ứng ở mảng value. Mã giả của đoạn code này như sau:

for [int i=0; i

Chủ Đề