当前位置: 首页 > 知识库问答 >
问题:

Java:实现自己的链表->在何处定义hasNext()、next()、remove()?

陆博易
2023-03-14

作业:请引导我帮助引导我,不要发布完整的代码

我的老师让我们实现一个LinkedList作为家庭作业。这是类shell的标题:

public class LinkedList<T> implements Iterable<T>, Iterator<T>

注意,他正在实现Iterable和Iterator接口。然后我明白了我需要在类中实现迭代器()、hasNext()、next()和remove()方法。但让我困惑的是,他没有将迭代器接口所需的方法放在单独的内部类中。以下所有方法都在LinkedList类中定义:

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Iterable#iterator()
 */
@Override
public Iterator<T> iterator()
{
    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see java.util.Iterator#hasNext()
 */
@Override
public boolean hasNext()
{
    return false;
}

/*
 * (non-Javadoc)
 * 
 * @see java.util.Iterator#next()
 */
@Override
public T next()
{
    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see java.util.Iterator#remove()
 */
@Override
public void remove()
{

}

迭代器()方法不应该返回如下内容:

public Iterator<T> iterator()
{
    return new MyClassIterator(front);
}

其中,MyClassificator()是用hasNext()、next()和remove()方法定义的。我错过了什么?


共有1个答案

井斌斌
2023-03-14

这确实是一条评论,但必须作为答案发布,因为它太长,很难以评论格式阅读。

在使用Iterable实现迭代器时要非常小心。可以同时为同一个Iterable运行多个迭代器。下面是一个测试程序,演示了这一点:

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Test {
  public static void main(String[] args) {
    List<String> myList = Arrays.asList(new String[] { "aaa", "bbb", "ccc" });
    Iterator<String> iter1 = myList.iterator();
    System.out.println("iter1: " + iter1.next());
    System.out.println("iter1: " + iter1.next());
    Iterator<String> iter2 = myList.iterator();
    for (String s; iter2.hasNext();) {
      s = iter2.next();
      System.out.println("iter2: " + s);
    }
    System.out.println("iter1.hasNext(): " + iter1.hasNext());
    System.out.println("iter2.hasNext(): " + iter2.hasNext());
    System.out.println("iter1: " + iter1.next());
  }
}

它打印:

iter1: aaa
iter1: bbb
iter2: aaa
iter2: bbb
iter2: ccc
iter1.hasNext(): true
iter2.hasNext(): false
iter1: ccc

使用Iterable实现迭代器的风险在于,最终两个迭代器都会有一个迭代器状态,而推进iter2会影响iter1。

当然,干净的解决方案是在您的Iterable实现中有一个私有类,它实现了Iterator,并为每个iterator()调用创建一个新的实例。iter1iter2然后引用不同的对象,对iter2状态的更改不会影响iter1

 类似资料:
  • 问题内容: 您如何在Java中以及在何处定义自己的Exception层次结构? 我的主要问题涉及必须定义Exception类的包位置。 我们是否为异常创建一个特殊的程序包并将所有类放入其中? 问题答案: 我将此作为一般规则。 在适当的地方,使用预定义的Java异常。例如,如果您的代码有某种I / O错误,则抛出IOException是可以的。 仅当需要在try / catch块中区分两个异常时,才

  • 本文向大家介绍Java自定义数组列表的实现操作,包括了Java自定义数组列表的实现操作的使用技巧和注意事项,需要的朋友参考一下 主要目的: 解决ArrayList 类不能改变大小的问题,主要实现数组列表动态调整大小。 1、数组类型如何选择?由于我们不清楚数组中具体存入什么类型的数据, 我们可以声明一个对象Object [ ] ,这样,数组列表就可以存储任何类型的数据了。 2、泛型<> :如果定义的

  • 本人一直很想自己造个 jQuery 的小库,第一是满足下自己,第二是去体验下 jQuery 内部的基情。

  • 本文向大家介绍我们如何在Java中实现自定义HashSet?,包括了我们如何在Java中实现自定义HashSet?的使用技巧和注意事项,需要的朋友参考一下 HashSet实现了不允许重复值的Set接口。HashSet不是同步的,也不是线程安全的。当我们可以向HashSet添加任何重复元素时,add()方法返回false,并且不允许向HashSet添加重复元素。 语法 在下面的示例中,我们可以实现自

  • 我想编写自己的定位器来访问元素。WebDriver的API目前提供了八个定位器,允许按id、名称属性、标记名、完整或部分链接文本、XPath、类名和css选择器检索元素。然而,这些默认定位器现在对我来说还不够,因为我必须通过一个新属性访问元素。让我举个例子,这样你就能明白我在这里真正想要的是什么。 示例:选择您的用户名: 现在,我想编写一段代码,以便使用myLocator定位器访问用户名按钮,如:

  • 本文向大家介绍Java如何实现自定义异常类,包括了Java如何实现自定义异常类的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java如何实现自定义异常类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自定义异常类步骤   创建一个类继承异常父类Exception   在具体的实现方法首部抛出异常类(自己创建的那个类),throws的