Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迭代数据而不保存它_Java_Iterator - Fatal编程技术网

Java 迭代数据而不保存它

Java 迭代数据而不保存它,java,iterator,Java,Iterator,我想写一个简单的程序,可以为我提供打印n个偶数从一些firstNumber开始的功能。它的数字是totalNumber。我不想保存它们,只是打印出来。这是我的一段代码: import java.util.Iterator; public class EvenNumbers implements Iterable<Integer>{ private int firstNumber; private int totalNumbers; public Even

我想写一个简单的程序,可以为我提供打印n个偶数从一些firstNumber开始的功能。它的数字是totalNumber。我不想保存它们,只是打印出来。这是我的一段代码:

import java.util.Iterator;

public class EvenNumbers implements Iterable<Integer>{

    private int firstNumber;
    private int totalNumbers;

    public EvenNumbers(int firstNumber, int totalNumbers) {
        this.firstNumber = firstNumber;
        this.totalNumbers = totalNumbers;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new myNewIterator();
    }

    private static class myNewIterator implements Iterator<Integer>{

        private int firstNumber;
        private int totalNumbers;
        private int tmp;

        public myNewIterator() {
            this.firstNumber = firstNumber;
            this.totalNumbers = totalNumbers;

            this.tmp = firstNumber - 2;
        }   

        @Override
        public boolean hasNext() {
            if(totalNumbers > 0){
                totalNumbers--;
                return true;
            }
            return false;
        }

        @Override
        public Integer next() {
            return tmp + 2;
        }
    }
}
正如你可能看到的,我没有得到这个程序的任何输出。 有人能解释一下我做错了什么吗?
非常感谢

为什么有这么多代码

public class Main {

    public static void main(String[] args) {
        int start = 14;
        int count = 4;

        for (int n = start; n < start + 2 * count; n += 2) {
            System.out.println(n);
        }
    }
}
公共类主{
公共静态void main(字符串[]args){
int start=14;
整数计数=4;
对于(int n=start;n@fafl是一个更好、更简洁的答案

指出此代码不起作用的原因:

1。问题在于myNewIterator构造函数。您正在为变量本身赋值。另外,int的默认值为零,迭代条件if(totalNumbers>0)将始终失败

public myNewIterator() {
        /** these two lines have to be changed**/ 
        this.firstNumber = firstNumber;
        this.totalNumbers = totalNumbers;
        /** end **/

        this.tmp = firstNumber - 2;
} 
您必须从构造函数中获取这两个值。下面是正确的代码。我还更正了构造函数的名称

2。在hasNext()方法中不能递减totalNumbers,因为假设只有一个next元素,如果我调用hasNext()100次而没有调用next(),它仍应返回true,即它有next元素。因此,在调用next()时应该发生递减

3。必须为下一次()调用更新tmp


这些更改也反映在以下代码中

import java.util.Iterator;

public class EvenNumbers implements Iterable<Integer>{

private int firstNumber;
private int totalNumbers;

public EvenNumbers(int firstNumber, int totalNumbers) {
    this.firstNumber = firstNumber;
    this.totalNumbers = totalNumbers;
}

@Override
public Iterator<Integer> iterator() {
    /***** changed *****/ 
    return new myNewIterator(this.firstNumber,this.totalNumbers);
}

private static class myNewIterator implements Iterator<Integer>{

    private int firstNumber;
    private int totalNumbers;
    private int tmp;

    /***** changed *****/ 
    public myNewIterator(int firstNo,int totalNo) {
         /***** changed *****/
        /****     edited these lines     *******/
        this.firstNumber = firstNo;
        this.totalNumbers = totalNo;
        /***** ****/

        this.tmp = firstNumber - 2;
    }   

    @Override
    public boolean hasNext() {
        if(totalNumbers > 0){
            /***** changed *****/   
            //totalNumbers--; //commenting this line as repeated calls of this line makes this call unsafe
            return true;
        }
        return false;
    }

    @Override
    public Integer next() {
        /***** changed *****/  
        totalNumbers--;
        tmp = tmp + 2
        return tmp;
    }
}
}
import java.util.Iterator;
公共类偶数实现了Iterable{
私人int firstNumber;
私人整数;
公共偶数(整数firstNumber、整数TotalNumber){
this.firstNumber=firstNumber;
this.totalNumbers=totalNumbers;
}
@凌驾
公共迭代器迭代器(){
/*****已更改******/
返回新的myNewIterator(this.firstNumber,this.TotalNumber);
}
私有静态类myNewIterator实现了迭代器{
私人int firstNumber;
私人整数;
私有int tmp;
/*****已更改******/
公共myNewIterator(int firstNo,int totalNo){
/*****改变*****/
/****编辑了这些行*******/
this.firstNumber=firstNo;
this.totalNumbers=totalNo;
/***** ****/
this.tmp=firstNumber-2;
}   
@凌驾
公共布尔hasNext(){
如果(总数>0){
/*****已更改******/
//totalNumbers--;//将此行注释为该行的重复调用会使该调用不安全
返回true;
}
返回false;
}
@凌驾
公共整数next(){
/*****已更改******/
总数--;
tmp=tmp+2
返回tmp;
}
}
}

“公共mojNoviIterator()”???这是代码编译。请更正代码编译了吗?似乎OP正在做一个关于迭代器的练习,而您的解决方案在这方面并没有提供太多帮助。请修改答案,使其提供迭代器
import java.util.Iterator;

public class EvenNumbers implements Iterable<Integer>{

private int firstNumber;
private int totalNumbers;

public EvenNumbers(int firstNumber, int totalNumbers) {
    this.firstNumber = firstNumber;
    this.totalNumbers = totalNumbers;
}

@Override
public Iterator<Integer> iterator() {
    /***** changed *****/ 
    return new myNewIterator(this.firstNumber,this.totalNumbers);
}

private static class myNewIterator implements Iterator<Integer>{

    private int firstNumber;
    private int totalNumbers;
    private int tmp;

    /***** changed *****/ 
    public myNewIterator(int firstNo,int totalNo) {
         /***** changed *****/
        /****     edited these lines     *******/
        this.firstNumber = firstNo;
        this.totalNumbers = totalNo;
        /***** ****/

        this.tmp = firstNumber - 2;
    }   

    @Override
    public boolean hasNext() {
        if(totalNumbers > 0){
            /***** changed *****/   
            //totalNumbers--; //commenting this line as repeated calls of this line makes this call unsafe
            return true;
        }
        return false;
    }

    @Override
    public Integer next() {
        /***** changed *****/  
        totalNumbers--;
        tmp = tmp + 2
        return tmp;
    }
}
}