Java中对集合的自制迭代器
为了准备考试,我正在写一些以前给我们的考试。在其中的一个系统中,我们必须实现EnterpriseNode。一项任务是编写一个迭代器,对Staffmembers进行迭代。下一步我编写了函数,但它不能正常工作。 这是我的代码:Java中对集合的自制迭代器,java,iterator,set,Java,Iterator,Set,为了准备考试,我正在写一些以前给我们的考试。在其中的一个系统中,我们必须实现EnterpriseNode。一项任务是编写一个迭代器,对Staffmembers进行迭代。下一步我编写了函数,但它不能正常工作。 这是我的代码: public StaffMemberIterator(HashSet<StaffMember> directSubordinates){ if(directSubordinates == null) throw new NullPointerExc
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测试,并且没有尽可能多地利用它们?您是否尝试过调试以查看迭代器的功能?他下一步怎么做?问题很多,代码也不多。我没有看到对集合成员强加特定顺序的任何东西。欢迎使用堆栈溢出!看起来您需要学习使用调试器。请随便吃点。如果您事后仍有问题,请随时回来,并提供一份证明您的问题的报告。