2010-04-21 38 views
34

Trong java nếu tôi đang lặp qua các keySet() của một HashMap, làm cách nào để tôi (bên trong vòng lặp), nhận được chỉ mục số của khóa đó?Java - lấy chỉ mục khóa trong HashMap?

Về cơ bản, khi tôi lặp qua bản đồ, tôi muốn có thể nhận được 0,1,2 ... Tôi cho rằng điều này sẽ sạch hơn việc khai báo một int và tăng dần với mỗi lần lặp.

Cảm ơn.

+3

Bạn cần nó để làm gì? Như đã đề cập trong các câu trả lời, thứ tự trong bản đồ không nhất thiết phải liên tục, nó có thể thay đổi khi các phím được thêm vào hoặc bị loại bỏ. – extraneon

+5

Thậm chí còn tốt hơn là hai HashMaps bằng nhau vẫn có thể có thứ tự khác nhau. Họ có thể làm điều đó * ngay cả khi họ có cùng lịch sử thêm/xóa * (các khả năng khác nhau sẽ làm điều đó). –

+0

http://stackoverflow.com/questions/18188739/arraylist-of-hashmap-or-linkedhashmap-to-get-item-by-index/18959271#18959271 –

Trả lời

4

Nói một cách đơn giản, các bộ sưu tập dựa trên băm không được lập chỉ mục, do đó bạn phải thực hiện thủ công.

+0

Cấu trúc dữ liệu được đề xuất trong trường hợp này là gì? –

18

HashMap không có thứ tự khóa được xác định.

8

Bạn không thể - một tập hợp không có thứ tự, do đó không có chỉ mục nào được cung cấp. Bạn sẽ phải khai báo một int, như bạn nói. Chỉ cần nhớ rằng lần sau bạn gọi keySet(), bạn sẽ không nhất thiết nhận được kết quả theo cùng một thứ tự.

+1

Nếu OP thực sự * muốn * điều này, không khó để viết một bộ sưu tập được hỗ trợ bởi TreeSet và Bản đồ. Bằng cách đó bạn có thể nhận được kết quả luôn theo cùng thứ tự.Bây giờ là làm thế nào để hành xử khi bản đồ được sửa đổi trong quá trình lặp lại là lên đến OP nhưng một cấu trúc dữ liệu đó là một bản đồ nơi các phím trong một bộ lệnh được chắc chắn có thể thực hiện được. (btw Tôi đang bình luận về câu trả lời của bạn hơn là câu hỏi của OP). – SyntaxT3rr0r

36

Không chắc nếu điều này là bất kỳ "sạch", nhưng:

List keys = new ArrayList(map.keySet()); 
for (int i = 0; i < keys.size(); i++) { 
    Object obj = keys.get(i); 
    // do stuff here 
} 
+1

Hoặc tương tự: 'int index = 0; cho (Object key: map.keySet()) {'Object value = map.get (khóa); ++ index; } // dang định dạng – benjineer

10

Nếu tất cả các bạn đang cố gắng làm là nhận được giá trị ra khỏi hashmap bản thân, bạn có thể làm điều gì đó như sau:

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    //TODO: this 
} 

Hoặc, bạn có thể duyệt qua các mục của bản đồ, nếu đó là những gì bạn quan tâm:

for (Map.Entry<Object, Object> entry : map.entrySet()) { 
    Object key = entry.getKey(); 
    Object value = entry.getValue(); 
    //TODO: other cool stuff 
} 

Như một cộng đồng, chúng tôi có thể cung cấp cho bạn câu trả lời phù hợp hơn nếu chúng tôi có ý tưởng nào đó tại sao bạn cần các chỉ mục hoặc những gì bạn nghĩ rằng các chỉ mục có thể làm cho bạn.

45

Sử dụng LinkedHashMap thay vì HashMap Nó sẽ luôn luôn trả phím trong cùng một trật tự (như chèn) khi gọi keySet()

Để cụ thể hơn, xem Class LinkedHashMap

+0

Thứ tự có thể không quan trọng - ví dụ, chúng tôi chỉ cần kiểm tra cặp đầu tiên hoặc lần đọc cuối cùng. – benjineer

4

tôi gần đây đã được học các khái niệm đằng sau HashMap và rõ ràng là không có thứ tự xác định các phím. Để lặp bạn có thể sử dụng:

Hashmap<String,Integer> hs=new Hashmap(); 
for(Map.Entry<String, Integer> entry : hs.entrySet()){ 
     String key=entry.getKey(); 
     int val=entry.getValue(); 
     //your code block 
    } 
2

viết bài này như một sự thay thế khả thi như nhau đối với @Binil câu trả lời của Thomas - cố gắng thêm nó như là một bình luận, nhưng không được thuyết phục về khả năng đọc của nó tất cả.

int index = 0; 

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    ++index; 
} 

Có thể không giúp áp phích câu hỏi gốc vì đây là tình huống mà họ đang cố tránh, nhưng có thể giúp những người khác tìm kiếm câu trả lời dễ dàng.

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