Vì vậy, tôi có một lỗi rất kỳ lạ. Tôi tình cờ gặp nó khi tôi ban đầu sử dụng một keySet() để lặp qua 10 khóa đầu tiên của TreeMap lớn. Một trong những chìa khóa đã trở về null, điều không nên có thể theo như sự hiểu biết của tôi. Vì vậy, tôi đã viết mã kiểm tra dưới đây:Key trong TreeMap trả về null
int i = 0;
for (Map.Entry<String, Integer> es : sortedMap.entrySet()){
if (i >= 10) {
break;
}
if (sortedMap.containsKey(es.getKey())){
System.out.println(es.getKey() + ":" + sortedMap.get(es.getKey()));
} else {
System.out.println("Key " + es.getKey() + " does not exist, yet...");
System.out.println("This does work: " + es.getKey() + ":" + es.getValue());
System.out.println("This does NOT work: " + es.getKey() + ":" + sortedMap.get(es.getKey()));
}
i++;
}
Và có được kết quả như sau:
SOAP:967
'excerpt'::679
'type'::679
Key 'author_url': does not exist, yet...
This does work: 'author_url'::679
This does NOT work: 'author_url'::null
'date'::679
Android:437
TLS:295
message:283
server:230
monthly:215
<<<<<<<<<<<<<<<<<<<<DUMPING MAP!
{SOAP=967, 'excerpt':=679, 'type':=679, 'author_url':=679, 'date':=679, Android=437, TLS=295, message=283, server=230, monthly=215...
tôi cắt đứt các bản đồ sau khi top mười là có rất nhiều trong đó, nhưng tất cả của nó là chìa khóa có giá trị. Vì vậy, câu hỏi của tôi là: Tại sao tôi nhận được một null khi sử dụng chìa khóa để trực tiếp nhận được (key) từ TreeMap, nhưng EntrySet trả về khóa và giá trị chính xác?
Dưới đây là so sánh của tôi kể từ khi tôi đang đặt hàng trên Integer:
class ValueComparator implements Comparator<Object> {
Map<String, Integer> base;
public ValueComparator(Map<String, Integer> base) {
this.base = base;
}
public int compare(Object a, Object b) {
if ((Integer) base.get(a) < (Integer) base.get(b)) {
return 1;
} else if ((Integer) base.get(a) == (Integer) base.get(b)) {
return 0;
} else {
return -1;
}
}
}
Và TreeMap được xây dựng như sau:
ValueComparator bvc = new ValueComparator(allMatches);
TreeMap<String, Integer> sortedMap = new TreeMap<String, Integer>(bvc);
//Sort the HashMap
sortedMap.putAll(allMatches);
đâu allMatches là một HashMap<String, Integer>
Bạn có đang sử dụng một trình so sánh khác thường cho TreeMap không? Nếu có, chúng ta có thể xem mã của nó không? Nó trông từ bãi chứa của bạn như thể bạn đang không sử dụng mặc định 'String' đặt hàng ... –
@LouisWasserman Thêm so sánh của tôi. –
Tại sao bạn có một hàm tạo và một thành viên trong lớp đó? Bộ so sánh thường được gọi cho mỗi phần tử, do đó bạn không nên tham khảo bản đồ kết quả. Toàn bộ mã của bạn sẽ hữu ích. – tom