迭代程序可以用于哪些数据结构



我刚刚参加了CS课程的一个测验,我想把我的想法和你们所知道的进行比较。提出的问题";以下哪种数据结构可以使用迭代器逐步完成"并且选项是";ArrayList,QueueADT的基于阵列的实现,以及StackADT的一个基于阵列的实施"您可以选择多个,但我只选择了ArrayList——我认为迭代器只能遍历对象数据结构,而且由于ADT是使用数组实现的,因此不能在它们上使用迭代器。我的想法不正确吗?

这个问题有点,嗯…不清楚。

对于每种感觉

如果意义是"你能为上的每个构造使用什么",那么答案是:Iterable的实例和数组:

int[] a = new int[10];
for (int b : a) { .... }

是合法的,即使a是不可迭代的。Iterable被定义为:具有方法public Iterator iterator() { .. }。所以迭代程序是不可迭代的,但像ArrayList这样的东西实现了Iterable

从这个意义上说,数组很像可迭代对象:您可以逐步遍历它们。只是,不使用迭代器,除非。。。

"迭代器可能是有意义的">

嘿,我可以让你成为一个迭代数组的迭代器,没问题:

String[] arr = new String[10];
return new Iterator<String>() {
private int idx = 0;
public boolean hasNext() { return idx < arr.length; }
public String next() { return arr[idx++]; }
};

那么,你能用迭代器遍历一个数组吗?我想是的。只写了5行。

"基于数组"并不意味着"数组"解释

ArrayList是List的一个基于数组的实现。因此命名为ArrayList。它是可迭代的,并将返回迭代器。这个实现看起来很像我在上一节中所写的内容。

假设QueueAdt是对此的引用,则QueueADT类似于List(仅定义操作的接口(;QueueADT"的基于阵列的实现;则将类似于CCD_ 10。然而,一个关键的区别是List接口本身要求任何实现都是Iterable<T>,而QueueADT接口不要求这样,假设我链接到了正确的代码。尽管如此,如果需要,实现(子类型(可以添加额外的功能。这是完全合法的:

public class ArrayQueueAdt<T> implements QueueADT<T>, Iterable<T> {
private final Object[] array;
@Override public Iterator<T> iterator() {
// something like the above
}
public void enqueue(T element) {
// impl here
}
// etcetera
}

在"arrays are Iterator or Iterable"意义上

那么没有。数组不实现Iterable,也没有iterator()方法。将数组转换为可迭代或迭代器的惯用java方法是:Arrays.asList(theArray),它是轻量级的(不复制任何内容(,并且是可迭代的。类似地,Arrays.asList(theArray).iterator()是一种轻量级(无副本(的获取方式。那么,也许呢?

它们不HAVE到(因为QueueADT不声明它,而List声明它(。

所以,答案几乎是(ツ)/我想是的,因为所有这些意义上的答案都是肯定的,或者可能。

最新更新