Сейчас я пытаюсь создать круговой список, где, когда я использую hasNext() из Iterator, он всегда должен возвращать true. Однако прямо сейчас он возвращает, что это не круговой список, и у меня также возникают проблемы с печатью значений (в этом примере строк) ArrayList. Вот класс CircularList я создал, который имеет внутренний класс Node для объектов, которые попали в список:У меня проблемы с моим CircularList
public class CircularList<E> implements Iterable{
private Node<E> first = null;
private Node<E> last = null;
private Node<E> temp;
private int size = 0;
//inner node class
private static class Node<E>{ //In this case I am using String nodes
private E data; //matching the example in the book, this is the data of the node
private Node<E> next = null; //next value
//Node constructors, also since in this case this is a circular linked list there should be no null values for previous and next
private Node(E data){
this.data = data;
}
}
//end of inner node class
public void addValue(E item){
Node<E> n = new Node<E>(item);
if(emptyList() == true){ //if the list is empty
//only one value in the list
first = n;
last = n;
}
else{ //if the list has at least one value already
//store the old first value
temp = first;
//the new first is the input value
first = n;
//next value after first is the old first value
first.next = temp;
//if after this there will be only two values in the list once it is done
if(size == 1){
last = temp;
}
//if the list is greater than one than the last value does not change, since any other values will be put before last in this case, and not replace it
//creating the circular part of the list
last.next = first;
}
size++;
}
public boolean emptyList(){
boolean result = false;
if(first == null && last == null){ //if there is no values at all
result = true;
}
return result;
}
@Override
public Iterator<E> iterator() {
// TODO Auto-generated method stub
return new CircularIterator<E>(); //each time this method is called it will be creating a new instance of my Iterator
}
}
Вот класс итератора творю:
public class CircularIterator<E> implements Iterator<E> {
@Override
public boolean hasNext() {
return false;
}
@Override
public E next() {
// TODO Auto-generated method stub
return null;
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
}
и, наконец, Тест класс:
public class Test {
static CircularList<String> c = new CircularList<String>(); //in this case it is a string list
static Iterator it = c.iterator();
public static void main(String[]args){
c.addValue("Bob");
c.addValue("Joe");
c.addValue("Jaina");
c.addValue("Hannah");
c.addValue("Kelly");
Iterate();
for(String val : c){
System.out.println(val);
}
}
private static boolean Iterate(){
boolean result = false;
if(!it.hasNext()){
System.out.println("Not a circular list!");
}
else{
result = true;
}
return result;
}
}
Опять я пытаюсь заставить его всегда возвращать так, я думаю, что проблема заключается в моем hasNext()
метод, но я не совсем уверен.
Все ваши 'hasNext' делает это' вернуть false'. –
Итератор до сих пор является лишь обычным автогенерированным заглушкой, поэтому он вообще не работает. Кроме того, если список пуст, 'Iterate' вернет false, хотя список округлен – Paul
@Paul Хорошо, не могу поверить, что я пропустил это. Что касается значений в списке, я могу добавить их правильно? Также было бы хорошим способом создать метод hasNext() без каких-либо параметров? – FyreeW