NỘI DUNG BÀI VIẾT
SortedMap trong Java là một Map cung cấp thứ tự tổng thể trên các key của nó.
SortedMap trong Java
SortedMap trong Java có thể được sắp xếp theo thứ tự tự nhiên của các key của nó hoặc bằng cách cung cấp một Comparator lúc tạo Map.
Nếu chúng ta không cung cấp một bất kỳ thứ gì trong Comparator (có thể chấp nhận key của Map) trong khi tạo SortedMap, thì tất cả các yếu tố chính của Map phải được implement interface có thể so sánh để đảm bảo thứ tự.
Contructors của SortedMap trong Java
Theo đặc điểm kỹ thuật, tất cả các lớp implement SortedMap có mục đích chung phải cung cấp các hàm tạo chuẩn sau:
- A void (no arguments) constructor: Nó phải tạo một bản đồ được sắp xếp được sắp xếp theo thứ tự tự nhiên của các khóa của nó.
- A constructor with an argument of type Comparator: Nó sẽ tạo một bản đồ được sắp xếp có các khóa được sắp xếp theo bộ so sánh được chỉ định.
- A constructor with an argument of type Map: Nó phải tạo một bản đồ được sắp xếp với các phần tử của bản đồ đã cung cấp được sắp xếp theo thứ tự tự nhiên của các khóa của nó.
- A constructor with an argument of type SortedMap: Nó phải hoạt động như một phương thức khởi tạo sao chép và tạo một bản đồ được sắp xếp mới với các phần tử giống nhau và cùng thứ tự của bản đồ được sắp xếp đã cung cấp.
Tất nhiên, không thể thực thi các khuyến nghị này vì các interaface không thể chỉ định các hàm tạo không giống như các phương thức.
Java SortedMap implementation
TreeMap là một implement được sử dụng rộng rãi của SortedMap. Hãy tạo các instance của nó bằng cách sử dụng các hàm tạo khác nhau được đề cập ở trên:
SortedMap<String, PersonalDetails> personMap = new TreeMap<>();
personMap.put("Dan Brown", new PersonalDetails("Writer", LocalDate.of(1964, 6, 22), "New Hampshire"));
personMap.put("Ayn Rand", new PersonalDetails("Writer", LocalDate.of(1905, 2, 2), "Saint Petersburg"));
personMap.put("Devdutt Pattanaik", new PersonalDetails("Mythologist", LocalDate.of(1970, 12, 11), "Mumbai"));
personMap.keySet().forEach(key -> {
System.out.println(key + " -> " + personMap.get(key));
});
Code language: JavaScript (javascript)
PersonlDetails thực hiện:
import java.time.LocalDate;
class PersonalDetails {
String occupation;
LocalDate dataOfBirth;
String city;
public PersonalDetails(String occupation, LocalDate dataOfBirth, String city) {
this.occupation = occupation;
this.dataOfBirth = dataOfBirth;
this.city = city;
}
@Override
public String toString() {
return this.occupation + ", from " + this.city;
}
}
Code language: JavaScript (javascript)
Nó sẽ in Map theo thứ tự tự nhiên của nó. Trong trường hợp này, loại khóa này là String, thực hiện interface Comparable.
Thay vì hàm tạo không đối số, nếu chúng ta cung cấp Comparator
triển khai trong đối số hàm tạo, đầu ra sẽ có thứ tự khác nhau. Hãy viết một biểu thức lambda để cung cấp compareTo
việc triển khai Comparator
giao diện. Giả sử chúng tôi muốn sắp xếp các khóa theo độ dài khóa theo thứ tự giảm dần của chúng:
SortedMap<String, PersonalDetails> personMap = new TreeMap<>((s1, s2) -> s2.length() - s1.length());
Code language: HTML, XML (xml)
Trong trường hợp này, đầu ra sẽ giống như bên dưới.
Devdutt Pattanaik -> Mythologist, from Mumbai
Dan Brown -> Writer, from New Hampshire
Ayn Rand -> Writer, from Saint Petersburg
Code language: JavaScript (javascript)
Bây giờ chúng ta sẽ tạo một bản đồ được sắp xếp bằng cách chuyển một đối tượng bản đồ khác hoặc một bản đồ được sắp xếp khác.
Map<String, PersonalDetails> map = new HashMap<>();
map.put("Dan Brown",
new PersonalDetails("Writer", LocalDate.of(1964, 6, 22), "New Hampshire"));
map.put("Ayn Rand",
new PersonalDetails("Writer", LocalDate.of(1905, 2, 2), "Saint Petersburg"));
map.put("Devdutt Pattanaik",
new PersonalDetails("Mythologist", LocalDate.of(1970, 12, 11), "Mumbai"));
SortedMap<String, PersonalDetails> sortedMap = new TreeMap<>(map);
sortedMap.keySet().forEach(key -> {
System.out.println(key + " -> " + sortedMap.get(key));
});
System.out.println("\nSorted Map constructed using another sorted map:");
SortedMap<String, PersonalDetails> copiedMap = new TreeMap<>(sortedMap);
copiedMap.keySet().forEach(key -> {
System.out.println(key + " -> " + copiedMap.get(key));
});
Code language: JavaScript (javascript)
Đầu ra:
Ayn Rand -> Writer, from Saint Petersburg
Dan Brown -> Writer, from New Hampshire
Devdutt Pattanaik -> Mythologist, from Mumbai
Sorted Map constructed using another sorted map:
Ayn Rand -> Writer, from Saint Petersburg
Dan Brown -> Writer, from New Hampshire
Devdutt Pattanaik -> Mythologist, from Mumbai
Code language: JavaScript (javascript)
Các phương thức Java SortedMap
So với Map
, một số phương pháp bổ sung được cung cấp để tận dụng lợi thế của việc đặt hàng. Hãy xem xét từng phương pháp được cung cấp.
Comparator comparator()
: Trả về cá thể so sánh được sử dụng để sắp xếp các khóa trong bản đồ. Nếu các khóa được sắp xếp theo thứ tự tự nhiên của chúng, nó sẽ trả về null.Set<Map.Entry> entrySet()
: Trả về một Tập hợp các ánh xạ có trong bản đồ.K firstKey()
: Trả về khóa đầu tiên (thấp nhất) trong bản đồ.K lastKey()
: Trả về khóa cuối cùng (cao nhất) trong bản đồ.Set keySet()
: Trả về một Tập hợp chứa tất cả các khóa của bản đồ.SortedMap headMap(K toKey)
: Trả về chế độ xem của phần bản đồ có số khóa nhỏ hơn toKey.SortedMap tailMap(K fromKey)
: Trả về chế độ xem của một phần bản đồ có các khóa lớn hơn hoặc bằng fromKey.Collection values()
: Trả về chế độ xem Bộ sưu tập của các giá trị có trong bản đồ này.
Lưu ý rằng Tập hợp được trả về trong các phương thức trên là dạng xem của Tập hợp thực tế. Những thay đổi được thực hiện trên các chế độ xem này cũng được phản ánh trên cấu trúc dữ liệu thực tế.
Triển khai Java SortedMap
Chúng ta hãy khám phá tất cả các phương pháp này từng cái một. Chúng tôi sẽ tạo một bản đồ được sắp xếp bằng cách chuyển một bộ so sánh và comparator()
phương thức sẽ trả về cùng một bộ so sánh.
SortedMap sortedMap = new TreeMap(Comparator.reverseOrder());
Comparator comparator = sortedMap.comparator();
Code language: JavaScript (javascript)
Bây giờ, Chúng ta hãy xem các ánh xạ trong bản đồ. Nó sẽ giúp chúng ta có một Set
trong số Map.Entry
.
SortedMap<String, PersonalDetails> sortedMap = new TreeMap<>(Comparator.reverseOrder());
sortedMap.put("Dan Brown", new PersonalDetails("Writer", LocalDate.of(1964, 6, 22), "New Hampshire"));
sortedMap.put("Ayn Rand", new PersonalDetails("Writer", LocalDate.of(1905, 2, 2), "Saint Petersburg"));
sortedMap.put("Devdutt Pattanaik", new PersonalDetails("Mythologist", LocalDate.of(1970, 12, 11), "Mumbai"));
Set<Map.Entry<String, PersonalDetails>> entrySet = sortedMap.entrySet();
entrySet.forEach(entry -> {
System.out.println(entry.getKey() + "->" + entry.getValue());
});
Code language: JavaScript (javascript)
Lặp lại thông qua entrySet
bản in di chúc:
Devdutt Pattanaik->Mythologist, from Mumbai
Dan Brown->Writer, from New Hampshire
Ayn Rand->Writer, from Saint Petersburg
Code language: PHP (php)
keySet()
phương thức sẽ trả về các Set
khóa, trong khi values()
sẽ trả về Collection
giá trị (Trong trường hợp của chúng tôi, kiểu giá trị là PersonalDetails
).
sortedMap.keySet().forEach(System.out::println);
Collection<PersonalDetails> values = sortedMap.values();
values.forEach(System.out::println);
Code language: PHP (php)
Ngoài ra, có sẵn các phương pháp để lấy khóa đầu tiên, khóa cuối cùng và một phần của bản đồ chứa các khóa nhỏ hơn hoặc lớn hơn một khóa cụ thể.
System.out.println("Smallest and largest keys of the map:");
System.out.println(sortedMap.firstKey());
System.out.println(sortedMap.lastKey());
System.out.println("Head map containing keys whose values are less than D.");
SortedMap headMap = sortedMap.headMap("D");
headMap.keySet().forEach(System.out::println);
System.out.println("Tail map containing keys whose values are greater than or equal to D:");
SortedMap tailMap = sortedMap.tailMap("D");
tailMap.keySet().forEach(System.out::println);
Code language: PHP (php)
Đó là tất cả đối với SortedMap trong Java. Chúc bạn học tốt.
Nguồn video: Coding with John java