假设我有这个简单的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+代码-我没有尝试编译或运行,因此可能包含错误(当前不在开发机器附近)。它还使用自动装箱转换Integer
为int
。
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迭代器,因此没有它们就必须这样做: