2012-01-17 19 views
14

thể trùng lặp:
Iterating through a LinkedHashMap in reverse orderLàm thế nào để duyệt Bản đồ Hash được Liên kết ngược lại?

Làm thế nào để Traverse Liên Kết Hash Bản đồ theo một thứ tự ngược lại? Có phương pháp nào được xác định trước trong bản đồ để làm điều đó không?

Tôi đang tạo ra nó như sau:

LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer,String>(); 
map.put(1, "one"); 
map.put(2, "two"); 
map.put(3, "three"); 
+3

Xem http://stackoverflow.com/questions/7170871/iterating-through-a-linkedhashmap-in-reverse-order –

Trả lời

12
List<Entry<Integer,String>> list = new ArrayList<>(map.entries()); 

for(int i = list.size() -1; i >= 0 ; i --){ 
    Entry<Integer,String> entry = list.get(i); 
} 

Không thực sự xinh đẹp và phải trả giá bằng một bản sao của tập nhập cảnh, mà nếu bản đồ của bạn có một số lượng đáng kể các mục có thể là một vấn đề.

Các Excellant Guava library có một [List.reverse(List<>)][2] mà sẽ cho phép bạn sử dụng Java 5 cho mỗi vòng lặp phong cách chứ không phải là vòng lặp được lập chỉ mục:

//using guava 
for(Entry entry : Lists.reverse(list)){ 
    // much nicer 
} 
18

Hãy thử điều này, nó sẽ in phím để chèn ngược :

ListIterator<Integer> iter = 
    new ArrayList<>(map.keySet()).listIterator(map.size()); 

while (iter.hasPrevious()) { 
    Integer key = iter.previous(); 
    System.out.println(key); 
} 

Bạn cũng có thể lặp lại theo lệnh chèn ngược của mục:

ListIterator<Map.Entry<Integer, String>> iter = 
    new ArrayList<>(map.entrySet()).listIterator(map.size()); 

while (iter.hasPrevious()) { 
    Map.Entry<Integer, String> entry = iter.previous(); 
    System.out.println(entry.getKey() + ":" + entry.getValue()); 
} 
+0

I don' t nghĩ rằng điều này sẽ làm việc như là danh sách iterator bắt đầu là sự khởi đầu của danh sách do đó iter.hasPrevious() sẽ được sai trên cuộc gọi đầu tiên –

+3

@GarethDavis bạn sai, danh sách vòng lặp trên bắt đầu tại _end_ của danh sách - đó là những gì 'listIterator (map.size())' làm. –

+0

Aah Tôi hiểu rồi, cảm ơn. –

4

QUY Ổi:

List<Object> reverseList = Lists.reverse(
     Lists.newArrayList(map.keySet())); 

Lists.reverse

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