2013-07-26 34 views
5

Tôi đang cố gắng viết một chương trình lặp qua một tập các bộ. Trong đoạn mã ví dụ dưới đây, tôi nhận được một lỗi cho biết rằng iter.next() là đối tượng kiểu thay vì một tập các chuỗi. Tôi đang gặp một số vấn đề bí ẩn khác với việc lặp lại các tập hợp các bộ. Bất kỳ đề xuất?Lặp lại tập hợp các bộ

  Set<String> dogs= new HashSet<String>(); 
      dogs.add("Irish Setter"); 
      dogs.add("Poodle"); 
      dogs.add("Pug"); 
      dogs.add("Beagle"); 

      Set<String> cats = new HashSet<String>(); 
      cats.add("Himalayan"); 
      cats.add("Persian"); 

      Set<Set<String>> allAnimals = new HashSet<Set<String>>();     
      allAnimals.add(cats); 
      allAnimals.add(dogs); 

      Iterator iter = allAnimals.iterator();    
      System.out.println(allAnimals.size()); 

      while (iter.hasNext()) 
      { 
       System.out.println(iter.next().size()); 
      } 

Một câu hỏi có liên quan với các thiết lập tương tự (trừ vòng lặp).
Đoạn mã dưới đây dẫn đến kết quả cuối cùng bao gồm dấu ngã. Nhưng tôi không muốn thay đổi allAnimals khi tôi đi! Làm cách nào để chỉnh sửa tiện ích mở rộng mà không ảnh hưởng đến tập hợp lớn hơn (allAnimals).

for (Set<String> extension : allAnimals) 
       { 
        System.out.println("Set size: " + extension.size()); 
        extension.add("~");  
        System.out.println(extension); 
       } 

       System.out.println(allAnimals); 
+3

Bạn không cần phải gọi 'someSet.clear();' ngay sau khi tạo tập hợp. – dasblinkenlight

+0

Cảm ơn! Tôi lo lắng về việc không bắt đầu các biến vì vậy tôi thỉnh thoảng bị quá tải. – user2623054

Trả lời

6

biến allAnimals của bạn là loại Set<Set<String>>, tuy nhiên, khi bạn hỏi Iterator của bạn "quên" các loại thông tin. Theo trình biên dịch, trình lặp của bạn chỉ chứa Object s. Thay đổi dòng nơi bạn nhận được Iterator thành số này

Iterator<Set<String>> iter = allAnimals.iterator(); 

và tất cả sẽ ổn.

+0

Cảm ơn, đã sửa lỗi. – user2623054

4

Sử dụng tăng cường cho vòng lặp để vượt qua các bộ, sẽ dễ dàng hơn so với sử dụng một iterator:

for (Set<String> names : allAnimals) { 
    System.out.println(names.size()); 
} 

Ví dụ, để đi qua tất cả các tên của con vật:

for (Set<String> names : allAnimals) { 
    for (String name : names) { 
     System.out.println(name); 
    } 
} 
+1

@ user2623054 Đây là lời khuyên tốt, tôi khuyên bạn nên theo dõi nó. Tuy nhiên, tôi cũng khuyên bạn nên đánh dấu mthmulders là câu trả lời được chấp nhận, vì nó xác định chính xác vấn đề. –

+0

Phương pháp này có vẻ dẫn đến một lỗi mới: "Chỉ có thể lặp qua một mảng hoặc một thể hiện của java.lang.Iterable" – user2623054

+0

'Set' là một thể hiện của' Iterable'. Bạn phải làm điều gì đó sai, bởi vì các tác phẩm trên, và đó là cách được khuyên dùng để lặp lại ngày nay. –

1

tôi sẽ chỉ cần sử dụng một (lồng) vòng lặp foreach:

for(Set<String> animals : allAnimals) { 
    int size = animals.size(); // if you want it 
    for (String animal : animals) { 
     // do something with the name 
    } 
} 
2

Bạn không đề cập đến type o n mà iterator của bạn được định nghĩa. Vì vậy, theo như nó có liên quan, nó hy vọng một đối tượng như sau.

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