Difference between revisions of "Classes Internas (Java)/Exercício 03: Iteração"

From Wiki**3

< Classes Internas (Java)
(Created page with "{{TOCright}} == Problema == Modele em UML e implemente a classe '''Menu''' que contém um número fixo de pratos (cadeias de caracteres), especificado na altura da criação d...")
 
(Solução)
 
(5 intermediate revisions by the same user not shown)
Line 6: Line 6:
 
<source lang="java">
 
<source lang="java">
 
public interface Iterator {
 
public interface Iterator {
   Boolean hasNext();
+
   boolean hasNext();
 
   String next();
 
   String next();
 
}
 
}
Line 28: Line 28:
  
 
= Solução =
 
= Solução =
 +
{{CollapsedCode|Menu.java|
 +
<source lang="java">
 +
public class Menu {
 +
  private String[] _entries;
 +
 +
  public Menu(int nentries) { _entries = new String[nentries]; }
 +
  public Iterator forwardIterator() { return new ForwardIterator(); }
 +
  public Iterator reverseIterator() { return new ReverseIterator(); }
  
== Exemplo de Aplicação ==
+
  private class ForwardIterator implements Iterator {
 +
    private int _index = 0;
 +
    public boolean hasNext() { return _index < _entries.length; }
 +
    public String next() { return _entries[_index++]; }
 +
  }
  
[[category:Ensino]]
+
  private class ReverseIterator implements Iterator {
 +
    private int _index = _entries.length - 1;
 +
    public boolean hasNext() { return _index >= 0; }
 +
    public String next() { return _entries[_index--]; }
 +
  }
 +
 
 +
}
 +
</source>
 +
}}
 +
[[category: Ensino]]
 
[[category:PO]]
 
[[category:PO]]
 
[[category:PO Exemplos]]
 
[[category:PO Exemplos]]

Latest revision as of 00:12, 29 September 2023

Problema

Modele em UML e implemente a classe Menu que contém um número fixo de pratos (cadeias de caracteres), especificado na altura da criação de cada instância da lista. A classe Menu, além de outros, possui dois métodos, forwardIterator() e reverseIterator(), que retornam instâncias de duas classes internas que implementam a interface

Iterator definida da seguinte forma:

public interface Iterator {
  boolean hasNext();
  String next();
}

O método forwardIterator() retorna um iterador que permite percorrer os elementos do menu do início para o fim. O método reverseIterator() retorna um iterador que permite percorrer os elementos do menu do fim para o início. Para o seguinte exemplo, a saída é SopaSaladaDoceDoceSaladaSopa.

public class App {
  public static void main(String[] args) {
    Menu menú = new Menu(3);
    // definição do conteúdo omitida por simplicidade (e.g. [ "Sopa", "Salada", "Doce" ])
    Iterator i1 = menu.forwardIterator();
    while (i1.hasNext()) System.out.print(i1.next());
    Iterator i2 = menu.reverseIterator();
    while (i2.hasNext()) System.out.print(i2.next());
  }
}

Defina as duas classes internas, assim como as outras partes da classe Menu necessárias para suportar o funcionamento das classes internas e a especificação acima. Note-se que a interface mencionada não é a nativa do Java.

Solução

Menu.java
public class Menu {
  private String[] _entries;

  public Menu(int nentries) { _entries = new String[nentries]; }
  public Iterator forwardIterator() { return new ForwardIterator(); }
  public Iterator reverseIterator() { return new ReverseIterator(); }

  private class ForwardIterator implements Iterator {
    private int _index = 0;
    public boolean hasNext() { return _index < _entries.length; }
    public String next() { return _entries[_index++]; }
  }

  private class ReverseIterator implements Iterator {
    private int _index = _entries.length - 1;
    public boolean hasNext() { return _index >= 0; }
    public String next() { return _entries[_index--]; }
  }

}