了解迭代器

如何解决了解迭代器

我正在练习迭代器,并且有2类“菜单”和“菜”菜单

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?