Java中对集合的自制迭代器

Java中对集合的自制迭代器,java,iterator,set,Java,Iterator,Set,为了准备考试,我正在写一些以前给我们的考试。在其中的一个系统中,我们必须实现EnterpriseNode。一项任务是编写一个迭代器,对Staffmembers进行迭代。下一步我编写了函数,但它不能正常工作。 这是我的代码: public StaffMemberIterator(HashSet<StaffMember> directSubordinates){ if(directSubordinates == null) throw new NullPointerExc

为了准备考试,我正在写一些以前给我们的考试。在其中的一个系统中,我们必须实现EnterpriseNode。一项任务是编写一个迭代器,对Staffmembers进行迭代。下一步我编写了函数,但它不能正常工作。 这是我的代码:

public StaffMemberIterator(HashSet<StaffMember> directSubordinates){
        if(directSubordinates == null) throw new NullPointerException("ofs");
        this.directSubordinates = directSubordinates;
    }


public StaffMember next() {
        if (!this.hasNext()){
            throw new NoSuchElementException("naf");
        }
        ArrayList<StaffMember> subList = new ArrayList<>(directSubordinates);
        StaffMember staffMember = subList.get(position);
        position++;
        return staffMember;
    }
这就是错误:

junit.framework.AssertionFailedError: StaffMemberIterator.next() should return the correct next element if there is one available! expected:<Name: Allie, Job: J1> but was:<Name: Lilith, Job: J3>
    at StaffMemberIteratorTest.testIterator(StaffMemberIteratorTest.java:48)

谢谢你们的帮助

正如克拉斯在评论中所说,哈希集不会强加任何特定的顺序。树集将基于自然排序或定义的比较器施加顺序。哈希集中值的顺序取决于哈希函数的结果

我不确定您的考试问题实际上在寻找什么,但考虑到您正在用Java实现迭代器,实现迭代器接口是有意义的

实施示例:

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

public class StaffIterator implements Iterator<StaffMember> {

    private final StaffMember[] staffMembers;
    private int index;

    public StaffIterator(Set<StaffMember> staffMembers) {
        this.staffMembers = staffMembers.toArray(new StaffMember[staffMembers.size()]);
        index = 0;
    }

    @Override
    public boolean hasNext() {
        return index < staffMembers.length;
    }

    @Override
    public StaffMember next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        return staffMembers[index++];
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}
注意:没有AbstractCollection那么有效。toArrayT[]a迭代集合以填充数组。但它肯定比每次调用都将集合复制到ArrayList中更有效。

尝试使用LinkedHashSet而不是HashSet

如果您没有得到预期的工作人员,那是因为HashSet没有保留元素的插入顺序。如中所述:

这个类实现Set接口,由一个哈希表(实际上是一个HashMap实例)支持。它不保证集合的迭代顺序;特别是,它不能保证订单在一段时间内保持不变。此类允许空元素

另一方面,保留插入顺序。正如Javadocs中引用的:

哈希表和链表的集合接口实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,即元素插入到集合插入顺序中的顺序。请注意,如果将图元重新插入到集合中,则插入顺序不受影响


所以您有JUnit测试,并且没有尽可能多地利用它们?您是否尝试过调试以查看迭代器的功能?他下一步怎么做?问题很多,代码也不多。我没有看到对集合成员强加特定顺序的任何东西。欢迎使用堆栈溢出!看起来您需要学习使用调试器。请随便吃点。如果您事后仍有问题,请随时回来,并提供一份证明您的问题的报告。