当前位置: 首页 > 面试题库 >

如何在Java中将迭代器实现为类的属性

吉玉宸
2023-03-14
问题内容

假设我有这个简单的MyArray类,它有两个简单的方法:添加,删除和迭代器。在主要方法中,我们可以看到应该如何使用它:

public class MyArray {
int start;
int end;
int[] arr;
myIterator it;
public MyArray(){
    this.start=0;
    this.end=0;
    this.arr=new int[500];
    it=new myIterator();
}
public void add(int el){
    this.arr[this.end]=el;
    this.end++;
}
public void delete(){
    this.arr[this.start]=0;
    this.start++;
}

public static void main(String[] args){
    MyArray m=new MyArray();

    m.add(3);
    m.add(299);
    m.add(19);
    m.add(27);
    while(m.it.hasNext()){
        System.out.println(m.it.next());
    }
}

然后应以某种方式实现MyIterator:

import java.util.Iterator;

public class myIterator implements Iterator{

@Override
public boolean hasNext() {
    // TODO Auto-generated method stub
    return false;
}

@Override
public Object next() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void remove() {
    // TODO Auto-generated method stub

}

}

MyIterator应该从 MyArray开始 ,从 开始结束 值迭代 arr ;两者都是 MyArray的
属性。那么,由于 MyIterator 应该使用 MyArray 属性,应如何实现MyIterator?也许我可以在初始化中发送当前对象: __

it=new myIterator(this);

但是我猜这不是最好的选择。也许MyArray本身应该实现Iterator接口?如何解决?

编辑:

好的,谢谢大家。这是我想做的一个简单示例,因此不必关心固定长度的数组。我真正想做的是循环FIFO,这就是为什么,start并且end是游标。

此循环的FIFO将是对与,例如,大小300个整数的数组:int[][] arr=new int[300][2]

迭代循环数组时,我必须注意计数器是否到达末尾并使其从头开始,所以这是我解决的方法:

if  (this.start >= this.end )   temp_end=this.end+this.buff.length; 
else    temp_end=this.end;
int ii;
int j=0;
int[] value=new int[2];
for(int i=this.start; i<temp_end; i++){
    ii=i% this.arr.length;
    value=this.buff[ii]; 
    //do anything with value

}

但是我想避免担心这些事情,而只是以一种简单的方式进行迭代,我可以使用迭代器接口来做到这一点,但是然后我遇到了两个问题:第一个问题我已经解释了并且已经通过许多答案解决了,第二个问题一个是我的数组是由成对的int组成的,并且我不能将迭代器与原始类型一起使用。


问题答案:

将迭代器维护为类的实例变量是非常不寻常的。您只能遍历一次数组-
可能不是您想要的。您更可能希望您的类为要遍历数组的任何人提供一个迭代器。下面是一个更传统的迭代器。

Java 5+代码-我没有尝试编译或运行,因此可能包含错误(当前不在开发机器附近)。它还使用自动装箱转换Integerint

public class MyArray implements Iterable<Integer> {

    public static class MyIterator implements Iterator<Integer> {

        private final MyArray myArray;
        private int current;

        MyIterator(MyArray myArray) {
            this.myArray = myArray;
            this.current = myArray.start;
        }

        @Override
        public boolean hasNext() {
            return current < myArray.end;
        }

        @Override
        public Integer next() {
            if (! hasNext())   throw new NoSuchElementException();
            return myArray.arr[current++];
        }

        @Override
        public void remove() {
            // Choose exception or implementation: 
            throw new OperationNotSupportedException();
            // or
            //// if (! hasNext())   throw new NoSuchElementException();
            //// if (currrent + 1 < myArray.end) {
            ////     System.arraycopy(myArray.arr, current+1, myArray.arr, current, myArray.end - current-1);
            //// }
            //// myArray.end--;
        }
    }

    ....

    // Most of the rest of MyArray is the same except adding a new iterator method ....

    public Iterator<Integer> iterator() {
        return new MyIterator();
    }

    // The rest of MyArray is the same ....

}

另请注意:请注意不要超过静态数组的500个元素限制。如果可以,请考虑使用ArrayList类。



 类似资料:
  • 问题内容: 我正在寻找一种将a 转换为或更具体地以将“迭代器”作为流“查看”的简洁方法。 出于性能原因,我想避免在新列表中复制迭代器: 根据评论中的一些建议,我也尝试使用: 但是,我得到了(因为没有调用hasNext) 我已经看过和,但我没有发现任何东西。 问题答案: 一种方法是从迭代器创建一个拆分器,并将其用作流的基础: 一个可能更易读的替代方法是使用Iterable-使用lambda从Iter

  • 当前:Bag$Node@1786F9D5下一个:Bag$Node@704D6E83 看起来很清楚,至少在我看来,下一个节点每次都会设置一个新节点。我将所有四个元素都添加到包中,但条目丢失,并为每个索引返回null。toArray()函数显示 我敢肯定这是一件简单得让人眼花缭乱的事情。下面是整个实现。

  • 问题内容: 我的问题很简单,我有一个以下JSON Typescript对象,并且我想迭代遍历JSON属性 使用的代码是以下有角TypeScript组件: 我真正需要的是遍历JSON的键值属性,并在我的HTML中显示它们。 非常感谢! 问题答案: 如果您使用的是Angular 6.1,请使用键值管道 对于Angular 5 示例:https://stackblitz.com/edit/keyvalu

  • 我正在寻找一种简洁的方法来将转换为或者更具体地说,将迭代器作为流“查看”。 出于性能原因,我希望避免在新列表中出现迭代器的副本: 基于评论中的一些建议,我还尝试使用: 但是,我得到一个(因为没有调用) 我查看了和,但没有找到任何东西。

  • 本文向大家介绍在Java中将迭代器Iterator转换为流Stream,包括了在Java中将迭代器Iterator转换为流Stream的使用技巧和注意事项,需要的朋友参考一下 首先,设置一个Interator- 现在,我们使用了流- 上面,方法convertIterator()用于转换。以下是方法- 示例 以下是在Java中将Iterator转换为Stream的程序- 输出结果

  • 问题内容: 我们有一个元素列表,并且有一个非常简单的碰撞检测,可以将每个对象与其他每个对象进行检查。 该检查是可交换的,因此为了避免重复两次,我们将在C ++中执行此操作: 这里的关键是副本 您将如何用Java编写此代码? 问题答案: 您不能复制Java迭代器,因此没有它们就必须这样做: