2013-03-14 14 views
15

Tôi đã cố gắng lặp qua hashmap trong Java, đây là một việc khá dễ thực hiện. Tuy nhiên, đoạn mã sau mang lại cho tôi một số vấn đề:Iterator trên HashMap trong Java

HashMap hm = new HashMap(); 

hm.put(0, "zero"); 
hm.put(1, "one"); 

Iterator iter = (Iterator) hm.keySet().iterator(); 

while(iter.hasNext()) { 

    Map.Entry entry = (Map.Entry) iter.next(); 
    System.out.println(entry.getKey() + " - " + entry.getValue()); 

} 

Trước tiên, tôi cần thiết để đúc Iterator trên hm.keySet() iterator(), vì nếu không nó nói: "Loại không phù hợp:. Không thể chuyển đổi từ java.util. Iterator để Iterator ". Nhưng sau đó tôi nhận được "Phương thức hasNext() là không xác định cho loại Iterator", và "Phương thức hasNext() là không xác định cho loại Iterator".

+5

Có vẻ như bạn đã nhập sai lớp 'Iterator'. Bạn sẽ muốn nhập 'java.util.Iterator'. – Vulcan

+2

Bạn cần phải lặp qua mục nhậpSet() không phải là keySet() nếu bạn muốn các entires hơn là các khóa. –

Trả lời

39

Chúng ta có thể thấy import khối của bạn? bởi vì có vẻ như bạn đã nhập sai lớp Iterator.

Một bạn nên sử dụng là java.util.Iterator

Để chắc chắn, hãy thử:

java.util.Iterator iter = hm.keySet().iterator(); 

Cá nhân tôi đề nghị như sau:

Bản Tuyên bố sử dụng Generics và khai sử dụng Giao diện Map<K,V> và tạo đối tượng bằng cách sử dụng mong muốn thực hiện HashMap<K,V>

Map<Integer, String> hm = new HashMap<>(); 

và cho vòng lặp:

for (Integer key : hm.keySet()) { 
    System.out.println("Key = " + key + " - " + hm.get(key)); 
} 

CẬP NHẬT 3/5/2015

Tìm thấy ra rằng iterating trên bộ nhập cảnh sẽ được hiệu suất tốt hơn khôn ngoan:

for (Map.Entry<Integer, String> entry : hm.entrySet()) { 
    Integer key = entry.getKey(); 
    String value = entry.getValue(); 

} 

CẬP NHẬT 10/3/2017

Đối Java8 và suối, giải pháp của bạn sẽ

hm.entrySet().stream().forEach(item -> 
        System.out.println(item.getKey() + ": " + item.getValue()) 
      ); 
+2

Giải pháp cập nhật của bạn cũng là yêu thích của tôi ;-) – zypro

6

Bạn thực sự nên sử dụng Generics và tăng cường cho vòng lặp cho việc này:

Map<Integer, String> hm = new HashMap<>(); 
hm.put(0, "zero"); 
hm.put(1, "one"); 

for (Integer key : hm.keySet()) { 
    System.out.println(key); 
    System.out.println(hm.get(key)); 
} 

http://ideone.com/sx3F0K

Hoặc phiên bản entrySet():

Map<Integer, String> hm = new HashMap<>(); 
hm.put(0, "zero"); 
hm.put(1, "one"); 

for (Map.Entry<Integer, String> e : hm.entrySet()) { 
    System.out.println(e.getKey()); 
    System.out.println(e.getValue()); 
} 
+0

bạn có thể vui lòng xác định sự khác biệt giữa hai cách tiếp cận là gì ?? –

+0

@ HussainAkhtarWahid'Ghouri 'Thực tế không nói gì - đây là lý do tại sao tôi không đề cập đến bất kỳ. Thứ hai có thể là nhanh hơn đáng kể kể từ khi bạn tránh tra cứu băm trên mỗi lần lặp. (Hoặc có thể không.) – millimoose

+0

Nếu anh ta cần sửa đổi bản đồ của mình thì sao? nó sẽ phải chịu trong trường hợp ngoại lệ sửa đổi đồng thời. – Eddnav

0

Cách sạch là không (trực tiếp) sử dụng một iterator tại tất cả:

  • loại bản đồ của bạn với generics
  • sử dụng vòng lặp foreach để lặp qua các mục nhập:

Như thế này:

Map<Integer, String> hm = new HashMap<Integer, String>(); 

hm.put(0, "zero"); 
hm.put(1, "one"); 

for (Map.Entry<Integer, String> entry : hm.entrySet()) { 
    // do something with the entry 
    System.out.println(entry.getKey() + " - " + entry.getValue()); 
    // the getters are typed: 
    Integer key = entry.getKey(); 
    String value = entry.getValue(); 
} 

Đây là cách hiệu quả hơn iterating trên phím, bởi vì bạn tránh n cuộc gọi đến get(key).

+0

thay đổi JM thành hm. tôi nghĩ ... sửa tôi nếu tôi sai :) – Neo

+0

@neo thx. Đó phải là iPhone tự động sửa:/ – Bohemian

0

Một số vấn đề ở đây:

  • Bạn có lẽ không sử dụng lớp iterator đúng. Như những người khác đã nói, sử dụng import java.util.Iterator
  • Nếu bạn muốn sử dụng Map.Entry entry = (Map.Entry) iter.next(); thì bạn cần sử dụng hm.entrySet().iterator(), không phải hm.keySet().iterator(). Hoặc bạn lặp lại trên các phím hoặc trên các mục nhập.
0
Map<String, Car> carMap = new HashMap<String, Car>(16, (float) 0.75); 

// không có trình lặp nào cho Maps nhưng có các phương pháp để thực hiện việc này.

 Set<String> keys = carMap.keySet(); // returns a set containing all the keys 
     for(String c : keys) 
     { 

      System.out.println(c); 
     } 

     Collection<Car> values = carMap.values(); // returns a Collection with all the objects 
     for(Car c : values) 
     { 
      System.out.println(c.getDiscription()); 
     } 
     /*keySet and the values methods serve as “views” into the Map. 
      The elements in the set and collection are merely references to the entries in the map, 
      so any changes made to the elements in the set or collection are reflected in the map, and vice versa.*/ 

     ////////////////////////////////////////////////////////// 
     /*The entrySet method returns a Set of Map.Entry objects. 
      Entry is an inner interface in the Map interface. 
      Two of the methods specified by Map.Entry are getKey and getValue. 
      The getKey method returns the key and getValue returns the value.*/ 

     Set<Map.Entry<String, Car>> cars = carMap.entrySet(); 
     for(Map.Entry<String, Car> e : cars) 
     { 
      System.out.println("Keys = " + e.getKey()); 
      System.out.println("Values = " + e.getValue().getDiscription() + "\n"); 

     } 
3

Với Java 8:

hm.forEach((k, v) -> { 
    System.out.println("Key = " + k + " - " + v); 
}); 
+0

điều này quá dễ với java 8 tuyệt vời – AndroidLover

0

Iterator qua keySet sẽ cung cấp cho bạn các phím. Bạn nên sử dụng entrySet nếu bạn muốn lặp lại các mục nhập.

HashMap hm = new HashMap(); 

hm.put(0, "zero"); 
hm.put(1, "one"); 

Iterator iter = (Iterator) hm.entrySet().iterator(); 

while(iter.hasNext()) { 

    Map.Entry entry = (Map.Entry) iter.next(); 
    System.out.println(entry.getKey() + " - " + entry.getValue()); 

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