gpt4 book ai didi

java - 为什么我的迭代器不工作?

转载 作者:行者123 更新时间:2023-11-30 07:07:57 25 4
gpt4 key购买 nike

对于类作业,我必须从头开始实现我自己的迭代器。迭代器正在迭代节点的链接列表。我所有使用迭代器的测试用例都失败了,我不知道它出了什么问题。

import java.util.Iterator;
import java.util.NoSuchElementException;

class LinkedNodeIterator<E> implements Iterator<E> {
LinkedNode<E> headNode;
LinkedNode<E> curr;


// Constructors
public LinkedNodeIterator(LinkedNode<E> head) {
headNode = head;
curr = headNode;
}

@Override
public boolean hasNext() {
if(headNode == null)
return false;
if(curr.getNext() == null)
return false;
return true;
}

@Override
public E next() {
if(curr.getNext() == null || curr == null)
throw new NoSuchElementException();
LinkedNode<E> save = curr;
curr = curr.getNext();
return save.getData();

}


@Override
public void remove() {
throw new UnsupportedOperationException();
}
}

一些失败的测试用例(它们都返回 count = 0):

public class PublicLinkedSetTest {
Set<String> set0;
Set<String> set1;
Set<String> set2;
Set<String> set3;
Set<String> set4;


@Before
public void before() {
set0 = new LinkedSet<String>();
set1 = new LinkedSet<String>();
for (String e : new String[]{"c", "a", "d", "b", "e"}) {
set1 = set1.adjoin(e);
}
set2 = new LinkedSet<String>();
for (String e : new String[]{"b", "d", "a", "e", "c"}) {
set2 = set2.adjoin(e);
}
set3 = new LinkedSet<String>();
for (String e : new String[]{"a", "d", "b"}) {
set3 = set3.adjoin(e);
}
set4 = new LinkedSet<String>();
for (String e : new String[]{"x", "y", "z", "a", "b", "d"}) {
set4 = set4.adjoin(e);
}
}

public void testIterator1() {
int count = 0;
for (String e : set1) {
count += 1;
}
assertEquals(5, count);
}

@Test

public void testIterator2() {
int count = 0;
for (String e : set2) {
count += 1;
}
assertEquals(5, count);
}

@Test

public void testIterator3() {
int count = 0;
for (String e : set3) {
count++;
}
assertEquals(3, count);
}

这是我的 LinkedSet 的代码

import java.util.Iterator;

public class LinkedSet<E> implements Set<E> {
private LinkedNode<E> head = null;
private LinkedNode<E> link;

// Constructors
public LinkedSet() {
}

public LinkedSet(E e) {
this.head = new LinkedNode<E>(e, null);
}

private LinkedSet(LinkedNode<E> header) {
header = head;

}

@Override
public int size() {
int count = 0;
for(E e : this){
count++;}
return count;
}

@Override
public boolean isEmpty() {
for(E e : this){
if(e != null)
return false;
}
return true;
}

@Override
public LinkedNodeIterator<E> iterator() {
return new LinkedNodeIterator<E>(this.head);
}

@Override
public boolean contains(Object o) {
for(E e : this){
if(e == o)
return true;
}
return false;
}

@Override
public boolean isSubset(Set<E> that) {
that = new LinkedSet<E>();
if(this.size()>that.size())
return false;
for(E e : this){
if(that.contains(e) == false)
return false;
}
return true;
}

@Override
public boolean isSuperset(Set<E> that) {
that = new LinkedSet<E>();
if(this.isSubset(that))
return true;
else
return false;
}

@Override
public Set<E> adjoin(E e) {
boolean alwaysEqual = true;
if(this.head == null)
return this;
for(E t : this){
if(t != e)
alwaysEqual = false;}
if(alwaysEqual == true)
return this;
LinkedNode<E> temp = this.head;
LinkedNode<E> newNode = new LinkedNode<E>(e, temp);
LinkedSet<E> newSet = new LinkedSet<E>(newNode);
Set<E> otherSet = newSet;

return otherSet;
}

@Override
public Set<E> union(Set<E> that) {
Set<E> thisSet = this;
for(E e : that){
if(!this.contains(e))
thisSet = thisSet.adjoin(e);

}

return thisSet;
}

@Override
public Set<E> intersect(Set<E> that) {
LinkedSet<E> newSet = null;
Set<E> otherNewSet = newSet;
for(E e : that){
if(this.contains(e)){
if(otherNewSet == null){
LinkedNode<E> newNode = new LinkedNode<E>(e, null);
otherNewSet = new LinkedSet<E>(newNode);
}
else{

otherNewSet = otherNewSet.adjoin(e);
}

}
}

return otherNewSet;
}

@Override
public Set<E> subtract(Set<E> that) {
LinkedSet<E> newSet = null;
Set<E> otherNewSet = newSet;
for(E e : that){
if(!this.contains(e)){
if(otherNewSet == null){
LinkedNode<E> newNode = new LinkedNode<E>(e, null);
otherNewSet = new LinkedSet<E>(newNode);
}
else{

otherNewSet = otherNewSet.adjoin(e);
}

}
}

return otherNewSet;
}

@Override
public Set<E> remove(E e) {
LinkedSet<E> newSet = null;
Set<E> otherNewSet = newSet;
if(!this.contains(e))
return this;
else{
for(E t : this){
if(t != e){
if(otherNewSet == null){
LinkedNode<E> newNode = new LinkedNode<E>(e, null);
otherNewSet = new LinkedSet<E>(newNode);
}
}
else{

otherNewSet = otherNewSet.adjoin(e);
}
}
}
return otherNewSet;
}

@Override
@SuppressWarnings("unchecked")
public boolean equals(Object o) {
if (! (o instanceof Set)) {
return false;
}
Set<E> that = (Set<E>)o;
return this.isSubset(that) && that.isSubset(this);
}

@Override
public int hashCode() {
int result = 0;
for (E e : this) {
result += e.hashCode();
}
return result;
}
}

最佳答案

问题不在于你的迭代器,而在于你的 adjoin 方法。

当您构造一个新的 LinkedSet 时,如下所示:

 set1 = new LinkedSet<String>();

这意味着你调用这个构造函数:

    // Constructors
public LinkedSet() {
}

但是该构造函数没有向 head 分配任何内容,因此它具有默认的初始值:

    private LinkedNode<E> head = null;

由于 headnull 开头,并且从未分配过,因此此方法除了返回 this 之外不会执行任何操作:

@Override
public Set<E> adjoin(E e) {
boolean alwaysEqual = true;
if (this.head == null)
return this;
for (E t : this) {
if (t != e)
alwaysEqual = false;
}
if (alwaysEqual == true)
return this;
LinkedNode<E> temp = this.head;
LinkedNode<E> newNode = new LinkedNode<E>(e, temp);
LinkedSet<E> newSet = new LinkedSet<E>(newNode);
Set<E> otherSet = newSet;

return otherSet;
}

所以你的迭代器没有迭代任何东西,因为你的集合中没有任何东西。

关于java - 为什么我的迭代器不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39759982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com