链接列表的自定义迭代器
我创建了一个自定义链接列表。我也为它做了一个迭代器。但是,我明白,程序没有在方法size()中循环。它出什么问题了?是关于我的不正确的循环或iterator()
。每个节点都有字段:nextIndex
,prevIndex
,value
。链接列表的自定义迭代器
public class CustomLinkedList<E> implements List<E>{
private ListNode<E> header = new ListNode<>();
public CustomLinkedList() {
this.header = new ListNode();
}
@Override
public int size() {
int size = 0;
for(E it : this) {
size++;
}
return size;
}
@Override
public boolean isEmpty() {
if(this.header == null){
return true;
} else {return false;}
}
@Override
public boolean contains(Object o) {
if(((Integer) header.getValue() == 42) && ((Integer) header.getNextIndex().getValue() == 38)) return true;
return false;
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
private ListNode it = header;
@Override
public boolean hasNext() {
return (it.getNextIndex() != header) && (it.getNextIndex() != null);
}
@Override
public E next() {
it = it.getNextIndex();
return (E) it.getValue();
}
@Override
public void remove()
{
throw new UnsupportedOperationException("Iterator is read-only");
}
};
}
@Override
public boolean add(E e) {
ListNode<E> temp = new ListNode<>();
temp.setValue(e);
if (this.size() < 1) {
header.setValue(e);
header.setPrevIndex(header);
header.setNextIndex(header);
} else {
temp.setNextIndex(header);
ListNode tempLast = header.getPrevIndex();
tempLast.setNextIndex(temp);
header.setPrevIndex(temp);
temp.setPrevIndex(tempLast);
}
return true;
}
@Override
public boolean remove(Object o) {
return true;
}
@Override
public boolean containsAll(Collection<?> c) {
throw new NotImplementedException();
}
@Override
public void clear() {
throw new NotImplementedException();
}
@Override
public E get(int index) {
throw new NotImplementedException();
}
@Override
public int indexOf(Object o) {
throw new NotImplementedException();
}
@Override
public boolean addAll(Collection<? extends E> c) {
throw new NotImplementedException();
}
}
你开始header.getNextIndex() == null
然后调用add(E e)
一次。 里面add()
,size()
将返回0,因此设置header.setPrevIndex(header)
和header.setNextIndex(header)
接下来你叫add(E e)
再次. Inside
的add(),
大小()will call
hasNext()and
hasNext()will check (it.getNextIndex() != header) && (it.getNextIndex() != null)
将返回假因为it.getNextIndex() == header
因此size()
将始终小于一个。
而且你的代码还有很多其他的bug。一个更好的部分实现将会像
public class CustomLinkedList<E> implements List<E> {
private ListNode<E> header;
public CustomLinkedList() {
this.header = null;
}
@Override
public int size() {
int size = 0;
for (E it : this)
size++;
return size;
}
@Override
public boolean isEmpty() {
return header == null;
}
@Override
public boolean contains(Object obj) {
if (header != null)
for (E it : this)
if (it.equals(obj))
return true;
return false;
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
private ListNode<E> it = null;
@Override
public boolean hasNext() {
if (it==null && header!=null)
return true;
else if (it != null)
return it.getNextIndex() != null;
else
return false;
}
@Override
public E next() {
if (it==null)
it = header;
else
it = it.getNextIndex();
return it.getValue();
}
@Override
public void remove() {
throw new UnsupportedOperationException("Iterator is read-only");
}
};
}
@Override
public boolean add(E e) {
ListNode<E> temp = new ListNode<>();
temp.setValue(e);
if (header == null) {
header = temp;
} else {
ListNode<E> it = header;
while (it.getNextIndex() != null)
it = it.getNextIndex();
temp.setPrevIndex(it);
it.setNextIndex(temp);
}
return true;
}
}
您需要通过元素使用的iterator
hasNext
和next
方法循环,并增加了尺寸,例如:
@Override
public int size() {
int size = 0;
for(Iterator<String> it = this.iterator(); it.hasNext(); it.next()){
size++;
}
return size;
}
它仍然没有进入循环。所以问题是不正确的加入或hasNext()。对? – Russiancold
如果它没有进入循环,那么你的列表可能是空的。 –
它不会进入循环内,因为add()方法是错误的。阅读我的解释为什么在另一个答案。 –
如何改进它以在for的第一次迭代中获取header.value?现在它不。因为在第一次迭代中,我们得到了header.getNextIndex()。getValue()。 – Russiancold
是的,你是对的。我编辑了hasNext()中的代码和它的初始化,但没有对它进行测试。我认为现在没问题。 –
非常感谢。 – Russiancold