Java iterable是如何工作的?

Java iterable是如何工作的?,java,data-structures,linked-list,iterator,deque,Java,Data Structures,Linked List,Iterator,Deque,嘿,伙计们,我一直在自学java,我正在做这个作业。 所以我从头开始编写一个链表,我使用LinkedList类编写一个Deque类 但是 关于类迭代器,只有一个问题我不理解。 我只是不明白Deque迭代器类应该做什么 此外,我的代码中包含以下内容: class Deque<Item> implements Iterable<Item>. 类Deque实现了Iterable。 但是编译器抱怨说,在我的Deque类中,我需要重写一个方法 @Override public

嘿,伙计们,我一直在自学java,我正在做这个作业。

所以我从头开始编写一个链表,我使用LinkedList类编写一个Deque类 但是

关于类迭代器,只有一个问题我不理解。 我只是不明白Deque迭代器类应该做什么

此外,我的代码中包含以下内容:

class Deque<Item> implements Iterable<Item>.
类Deque实现了Iterable。
但是编译器抱怨说,在我的Deque类中,我需要重写一个方法

@Override
public Iterator<Item> iterator()
{
    throw new UnsupportedOperationException("Not supported yet.");
}
@覆盖
公共迭代器迭代器()
{
抛出新的UnsupportedOperationException(“尚未支持”);
}

但是我不明白为什么迭代器是访问集合中元素的概念。因为您说
实现了Iterable
,所以您告诉编译器您提供了访问数据块元素的机制。但这还不够。除了声称你会去做之外,你还必须去做。在这种情况下,这样做就是实现方法

如果您不:

因为您告诉编译器您将提供这个,所以必须实现方法
iterator()
,这是访问概念的一部分。如果你不实现这个方法,编译器会抱怨并告诉你“嘿,你说过你会这么做的,所以遵守你的诺言!”

有两种方法可以解决此问题:

1.)首先,不要承诺您将通过迭代器提供访问概念-remove
implements Iterable


2)遵守诺言,实施方法。您必须为此编写自己的迭代器类。一旦你知道该做什么,这是一个相当短的任务。

Java中有两种不同的迭代接口,它们很重要,而且。它们各自有不同的用途

Iterable

当一些东西实现这个接口时,这意味着它可以被迭代。这对我们很有用,因为Java为我们提供了一个快捷方式,可以使用for-each循环迭代实现
Iterable

List<String> elements = ... ; // List is an instance of Iterable
for (String element : elements)
    System.out.println(element);
这让我们想到

迭代器

这个接口是迭代实际执行的方式。for-each循环编译为如下内容:

MyDeque<String> elements = ... ;
for (Iterator<String> $iter = elements.iterator(); $iter.hasNext();) {
    String element = $iter.next();
    System.out.println(element);
}
MyDeque元素=;
for(迭代器$iter=elements.Iterator();$iter.hasNext();){
String元素=$iter.next();
系统输出打印项次(元素);
}
这段代码在功能上等同于上述每个代码的
hasNext()
是延续条件(我有更多的东西要给你吗?)并且
next()
实际上给你下一个元素,或者如果我们没有其他东西,抛出一个
NoTouchElementException


让自定义deque实现
Iterable
的目的就是让它可以使用类似
for
循环的方法在deque中迭代元素。它的
迭代器
实现就是让你真正进行迭代的东西。

当你
实现一个接口时,你必须实现它的方法。你能澄清你在这方面的疑问吗?
iteratior()
每次调用它时都应该返回一个新的迭代器。您必须创建一个实现
iterator
的实例,并在iterator()方法中返回它。接口是一个
contract
,它指定一些方法及其行为。为了实现接口,您的类必须绑定到该契约,并提供那些应该按预期工作的方法。那么创建Deque Iteraror类有什么意义呢?是因为我将在方法迭代器()中创建它的一个实例吗?所以创建类Deque Iteraror的目的是因为我将在方法迭代器()中创建它的一个实例吗?是的。但Deque类并不是最终目的。这样做的目的是,以后在其他代码中使用Deque类时,可以使用迭代器概念来访问Deque中的元素。这使得编写使用Deque类的代码变得更简单。类似于将代码复杂性从一个代码部分转移到另一个代码部分,或者更好地说,从一个抽象级别转移到另一个抽象级别。找到使用集合类和迭代器的示例代码,您将更好地理解它,例如,在Got it Thank dude的前两个示例代码。如果你有任何例子,你能链接我吗?再次感谢
MyDeque<String> elements = ... ;
for (Iterator<String> $iter = elements.iterator(); $iter.hasNext();) {
    String element = $iter.next();
    System.out.println(element);
}