2012-09-14 26 views
7

Tôi có một SortedMap, được sắp xếp theo thứ tự tự nhiên của khóa của nó. Tôi có thể an toàn bỏ keySet() của mình vào một số SortedSet mà không mạo hiểm một ngoại lệ truyền không hợp lệ.Có thể keySet() của SortedMap luôn được đúc an toàn cho một SortedSet không?

Tức là, điều gì sẽ xảy ra sau đây?

SortedMap<K, V> map = ...; 
SortedSet<K> set = (SortedSet<K>) map.keySet(); 

Nếu câu trả lời "phụ thuộc vào việc triển khai SortedMap", điều này có an toàn tối thiểu cho TreeMap không?

+0

Đối với tất cả những người viết "không được bảo đảm trong tài liệu", hãy để tôi chỉ ra rằng tài liệu cho khóa của SetedSet() nói "Bộ lặp của bộ trả về các khóa theo thứ tự tăng dần." Vì vậy, mặc dù nó không phải là một "SortedSet", nó là một tập hợp được sắp xếp ... –

+1

Trong thực tế nó ** là ** một SortedSet. Nhưng về lý thuyết, miễn là nó không được chỉ định, nó không phải (ví dụ, một SortedSet mới không phải là tập hợp khóa nội bộ có thể được tạo ra cho phép lặp lại - thừa nhận rằng điều này sẽ là ngu ngốc). – assylias

+0

Chỉnh sửa: ngay cả trong thực tế, nó không phải luôn luôn là một Sortedset như chỉ ra bởi một trong những câu trả lời. – assylias

Trả lời

12

Nói chung, không phải vì nó không được ghi trong javadoc.

Tuy nhiên, TreeMap cũng thực hiện NavigableMap, trong đó sử dụng một NavigableSet như một bộ chìa khóa và kéo dài NavigableSetSortedSet ...

Vì vậy, những gì bạn có thể làm là:

NavigableMap<K, V> map = ...; //can be a TreeMap or a ConcurrentSkipListMap 
SortedSet<K> set = map.navigableKeySet(); 
4

Do tài liệu không đảm bảo rằng tài liệu sẽ là SortedSet, ngay cả khi triển khai hiện tại triển khai theo cách đó (và tôi chưa kiểm tra), điều đó không có nghĩa là nên giả định.

1

Không nó không an toàn kể từ khi tài liệu không nói nó là. Điều này nên được an toàn mặc dù:

SortedSet<K> set = new TreeSet<K>(map.keySet());

8
SortedMap<String, String> treeMap = new TreeMap<String, String>(); 
// prints true 
System.out.println(treeMap.keySet() instanceof SortedSet); 
// prints false 
System.out.println(Collections.synchronizedSortedMap(treeMap).keySet() instanceof SortedSet); 

Vì vậy, câu trả lời là không.

TreeMap.keySet() trả về số SortedSet, nhưng không được đảm bảo bởi javadoc.

Giao diện NavigableMap, kéo dài SortedMap, có một phương pháp navigableSet(), mà returs một NavigableSet, kéo dài SortedSet, mặc dù.

+1

+1 cho ví dụ phản đối! – assylias

Các vấn đề liên quan