如何解决了解迭代器
Class Menu代表餐厅的菜肴集合。实现是在基本的ArrayArray上完成的。 ArrayList迭代器用于迭代。
我的疑问是,是否可以在同一类中以及如何使用for-each和不同的迭代器。
菜单类:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Menu implements Iterable<Plat> {
private List<Plat> plats=new ArrayList<Plat>();
@Override
public Iterator<Plat> iterator() {
return new Iteratorvegetaria(plats);
}
public Iterator<Plat> iteratorCarnivoro() {
return new IteratorCarnivoro(plats);
}
public void afegirPlat(Plat p){
plats.add(p);
}
public static void main(String[] args) {
Menu m=new Menu();
Iterator<Plat> c=m.iteratorCarnivoro();
Iterator<Plat> v=m.iterator();
m.afegirPlat(new Plat("soup",1.5,true,false,true));
m.afegirPlat(new Plat("pizza",2.5,false));
m.afegirPlat(new Plat("chicken",5.80,true));
m.afegirPlat(new Plat("salad",true));
System.out.println("Non-vegetarian menu");
// Iteration without for-each
while (c.hasNext()){
System.out.println(c.next());
}
// Iteration with for-each (doesn't work and only show vegetarian dishes)
for(Plat p: m){
System.out.println(p);
}
System.out.println("vegetarian menu:");
// Iteration without for-each
while(v.hasNext()){
System.out.println(v.next());
}
/* Iteration with for-each*/
for(Plat p: m){
System.out.println(p);
}
}
public class Iteratorvegetaria implements Iterator<Plat>{
private List<Plat>plats;
private int actual=0;
public Iteratorvegetaria(List<Plat>p){
plats = p;
}
// With this method we define that has next iterate as long as it finds an object that is vegetarian and adds it to the array.
@Override
public boolean hasNext() {
boolean hiHaNext = false;
int i = actual;
while (i<plats.size() && !hiHaNext){
if (plats.get(i).isvegetaria()) hiHaNext = true;
else i++;
}
return hiHaNext;
}
//With this method we define that next will iterate and jump to the next position when it finds a non-vegetarian dish
@Override
public Plat next() {
Plat p=plats.get(actuaL++);
while (!p.isvegetaria()){
p=plats.get(actuaL++);
}
return p;
}
}
public class IteratorCarnivoro implements Iterator<Plat>{
private List<Plat>plats;
private int actual=0;
public IteratorCarnivoro(List<Plat>p){
plats = p;
}
// With this method we define that has next iterate as long as it finds an object that is non-vegetarian and adds it to the array.
@Override
public boolean hasNext() {
boolean hiHaNext = false;
int i = actual;
while (i<plats.size() && !hiHaNext){
if (!plats.get(i).isvegetaria()) hiHaNext = true;
else i++;
}
return hiHaNext;
}
//With this method we define that next will iterate and jump to the next position when it finds a vegetarian dish
@Override
public Plat next() {
Plat p=plats.get(actuaL++);
while (p.isvegetaria()){
p=plats.get(actuaL++);
}
return p;
}
}
}
菜式:
public class Plat {
private String nom;
private double preu;
private boolean vegetaria;
private boolean apteCeliacs;
private boolean baixCalories;
public Plat(String nom,double preu,boolean vegetaria,boolean apteCeliacs,boolean baixCalories) {
this.nom = nom;
this.preu = preu;
this.vegetaria = vegetaria;
this.apteCeliacs = apteCeliacs;
this.baixCalories = baixCalories;
}
public boolean isvegetaria() {
return vegetaria;
}
@Override
public String toString() {
String missatge = "Plat{" +
"nom='" + nom + '\'' +
",preu=" + preu +
",apteCeliacs=" + apteCeliacs +
",baixCalories=" + baixCalories +
",vegetaria=";
if (isvegetaria()){
return missatge+" es vegetaria";
}else{
return missatge+" no es vegetaria";
}
}
}
Non-vegetarian menu
Plat{nom='chicken',preu=5.8,apteCeliacs=true,baixCalories=true,vegetaria= no es vegetaria
Plat{nom='soup',preu=1.5,apteCeliacs=false,vegetaria= es vegetaria
Plat{nom='pizza',preu=2.5,baixCalories=false,vegetaria= es vegetaria
Plat{nom='salad',vegetaria= es vegetaria
vegetarian menu:
Plat{nom='soup',vegetaria= es vegetaria
Plat{nom='soup',vegetaria= es vegetaria
解决方法
这个while循环似乎坏了。循环结构本身有点奇怪并且难以阅读,但是问题似乎是您似乎也从未更新过actual
。
while (i<plats.size() && !hiHaNext){
if (plats.get(i).isVegetaria()) hiHaNext = true;
else i++;
}
return hiHaNext;
尝试类似的东西:
while (i<plats.size()){
if (plats.get(i).isVegetaria()) hiHaNext = true;
else i++;
}
actual = i;
return hiHaNext;
,
如果这是一个针对学校的案例研究,它成功地说明了如何为实现Iterable的类创建多个迭代器是一个坏主意:)我并不是说这是不可能的,只是说这是不明智的。
通常,如果要在迭代时更改集合,则使用迭代器
Iterator.remove();
如果您尝试使用Iterator / ListIterator之外的其他方法在集合中循环访问时删除元素,则会炸毁我们都非常喜欢的ConcurrentModificationException
您应该利用Java 8中引入的Streams(除非出于某些原因使用的是旧版本)
List<Plate> menu = new ArrayList();
List<Plate> vegetarianChoices = menu.stream().filter(new Predicate<Plate>() {
@Override
public boolean test(Plate plate) {
return plate.isVegitarian();
}
}).collect(Collectors.toList());
List<Plate> nonVegetarianChoices= menu.stream().filter(new Predicate<Plate>() {
@Override
public boolean test(Plate plate) {
return !plate.isVegitarian();
}
}).collect(Collectors.toList());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。