2014-02-02 2 views
12

У меня есть Book и BookList классы. BookList что-то вроде этого:Как я могу сделать свой класс итерабельным, чтобы я мог использовать синтаксис foreach?

public class BookList 
{ 
    private final List<Book> bList = new ArrayList<Book>(); 

    public int size() { return bList.size(); } 

    public boolean isEmpty() { ... } 

    public boolean contains(Book b) { ... } 

    public boolean add(Book b) { ... } 

    public boolean remove(Book b) { .. } 

    public void clear() { ... } 

    public Object get(int index) { ... } 

} 

В моем главном классе я хочу напечатать название книг с в течение каждого цикла:

for(Book b : bList) 
{ 
    b.print(); 
} 

Затмение говорит:

Может только итерация над массивом или экземпляром java.lang.Iterable

Как c Я получаю эту работу?

+0

Вы должны реализовать этот интерфейс. – SLaks

+0

Попробуйте реализовать интерфейс 'Iterable'. – AntonH

+1

Что вы классно добавляете к простому списку ? Он даже удаляет тип-безопасность, поскольку он имеет метод 'add (Object)' вместо 'add (Book)'. –

ответ

15

Вам необходимо реализовать интерфейс Iterable, что означает, что вам необходимо реализовать метод iterator(). В вашем случае, это может выглядеть примерно так:

public class BookList implements Iterable<Book> { 
    private final List<Book> bList = new ArrayList<Book>(); 

    @Override 
    public Iterator<Book> iterator() { 
     return bList.iterator(); 
    } 

    ... 
} 
1

Чтобы быть более конкретную информацию о том, как «реализовать интерфейс Iterable»:

public class BookList implements Iterable<Book> 
{ 
    private final List<Book> bList = new ArrayList<Book>(); 

    ... 

    @Override 
    public Iterator<Book> iterator() 
    { 
     return bList.iterator(); 
    } 
} 
+3

Обратите внимание, что это позволит вызывающим абонентам удалять книги, не проходя через метод BookList.remove(), который прерывает инкапсуляцию. Вам лучше использовать 'return Collections.unmodifiableList (bList) .iterator();' –

16

Реализовать интерфейс Iterable. Это означает, что вам нужно реализовать метод, который возвращает объект Iterator, который будет перебирать элементы BookList.

В этом случае ваш метод iterator() может просто вернуть результат вызова bList.iterator(). (Это приведет к for (Book b : somBookList) перебрать Book объектов в BookList.bList ...)

В других случаях вам может понадобиться, чтобы написать свой собственный класс Iterator<T> реализации, в комплекте с T next(), boolean hasNext() и remove() методов. Например, если вы хотите, чтобы предотвратить внешний код от удаления элементов из BookList через ваш итератор, вы можете реализовать это следующим образом:

public class BookList implements Iterable<Book> { 
    private final List<Book> bList = new ArrayList<Book>(); 
    //... 
    @Override 
    public Iterator<Book> iterator() { 
     return new Iterator<Book>() { 
      private final Iterator<Book> iter = bList.iterator(); 

      @Override 
      public boolean hasNext() { 
       return iter.hasNext(); 
      } 

      @Override 
      public Book next() { 
       return iter.next(); 
      } 

      @Override 
      public void remove() { 
       throw new UnsupportedOperationException("no changes allowed"); 
      } 
     }; 
    } 
} 
+3

┼1 для части "* других случаев *". –

0

Для создания класса iteratable необходимо реализовать Iterable интерфейс.

а) объявляет класс, как показано ниже

public class BookList implements Iterable<Book> 

б) Переопределение iterator() Метод

Read More. Надеюсь, это поможет вам.

5

Здесь мы можем увидеть простую реализацию LinkedList с итератора и Еогеасп синтаксис

class LinkedList implements Iterable<LinkedList.Node>{ 
    private Node node; 
    public void add(Object data){ 
     if(!Optional.ofNullable(node).isPresent()){ 
      node = new Node(); 
      node.setData(data); 
     }else{ 
      Node node = new Node(); 
      node.setData(data); 
      Node lastNode = getLastNode(this.node); 
      lastNode.setNext(node); 
     } 
    } 

    private Node getLastNode(Node node){ 
     if(node.getNext()==null){ 
      return node; 
     }else{ 
      return getLastNode(node.getNext()); 
     } 
    } 

    class Node{ 
     private Object data; 
     private Node next; 
     public Object getData() { 
      return data; 
     } 
     public void setData(Object data) { 
      this.data = data; 
     } 
     public Node getNext() { 
      return next; 
     } 
     public void setNext(Node next) { 
      this.next = next; 
     } 
    } 

    public Iterator<Node> iterator() { 
     return new NodeIterator(); 
    } 

    class NodeIterator implements Iterator<Node>{ 
     private Node current; 

     public boolean hasNext() { 
      if(current == null){ 
       current = node; 
       return Optional.ofNullable(current).isPresent(); 
      }else{ 
       current = current.next; 
       return Optional.ofNullable(current).isPresent(); 
      } 
     } 

     public Node next() { 
      return current; 
     } 
    } 
} 

public class LinkedListImpl { 
    public static void main(String[] args) { 
     LinkedList linkedList = new LinkedList(); 
     linkedList.add("data1"); 
     linkedList.add("data2"); 
     linkedList.add("data3"); 
     for(LinkedList.Node node: linkedList){ 
      System.out.println(node.getData()); 
     } 
    } 
} 
Смежные вопросы