Sortierte Liste

HermeZ

Mitglied
Hallo,
ich habe ein mehr der weniger großes Problem mit einer sortierten Liste...
Naja wir sollen eine selber implementieren und ich bin jetzt schon am Verzweifeln. Schaffe es einfach nicht sie zum laufen zu bringen.

bekomme immer eine NullPointerException
so ganz blicke ich da natürlich nicht durch, sonst wüsste ich ja warum.

ist natürlich ganz schön lang, aber der fehler muss irgendwo in der removeAll liegen


Code:
public class SortedSet implements Collection
{
	private Iterator myIterator = null;
	private int counter;
	private Knot start;
	private Knot save;
	
	public SortedSet()
	{
		start = null;
		counter = 0;
	}
	
	public boolean add(Object o)
	{
		Knot foo = new Knot(o);
		
		if (counter == 0)
		{	
			start = foo;
			counter++;
			return true;
		}
		else
			if(!contains(foo.value))
			{
				save = start;
				foo.next = start;
				start = foo;
				counter++;				
				return true;
			}
			else
				return false;
	}
	
	public boolean addAll(Collection c)
	{
		Iterator foo = c.iterator();
		while (foo.hasNext())
		{
			add((foo.next()));
			//add(((Knot)foo.next()).value);
		}
		return true;
	}
	
	public void clear()
	{
		start = null;
		save = null;
		counter = 0;
	}
	
	public boolean contains(Object o)
	{
		Knot foo = start;
				
		if (o==null)
			return false;
		while(!(foo.next==null)&&!(foo==null))
		{
			if (((Student)o).compareTo(foo.value)==0)
			{
				return true;
			}
			foo = foo.next;
			
		}
		return false;
	}
	
	public boolean containsAll (Collection c)
	{
		Iterator foo = c.iterator();
		while(foo.hasNext())
		{
			//if (!contains(((Knot)foo.next()).value))
			if (!contains((foo.next())))
			{
				return false; 
			}
			
		}
		return true;
	}
	
	
	public boolean equals (Object o)
	{
		Knot foo =save;
		if ((foo.value).equals((Student)(o)))
		{
			return true;
		}
		return false;
	}
	
	public int hashCode ()
	{
		return start.hashCode();
	}
	
	public boolean isEmpty()
	{
		return (start==null);
	}
	
	public Iterator iterator()
	{
		return (new MyIterator(start));
		
		
	}
	
	public boolean remove (Object o)
	{
		/*Knot foo = start;
		if ((foo.value).equals((Student)(o)))
			{
				
				counter--;
				return true;
			}
		return false;*/
		boolean ret = false;
		Knot move,tmp;
		move=start;
		tmp=start;
		while(!ret)
		{
			if((move.value).equals((Student)o))
			{
				tmp.next=move.next;
				move=null;
				counter--;
				ret=true;
			}
			else
			{
				tmp=move;
				if(move.next!=null)
					move=move.next;
				else
					break;
			}	
		}
		return ret;
		
	}
	
	public boolean removeAll (Collection c)
	{
		Iterator foo = c.iterator();
		while((foo.hasNext())&&((foo.next())!=null))
		{
			if ((foo.next())!=null)
			remove(foo.next());
			//foo.next();
		}
		return true;
	}
	
	public boolean retainAll (Collection c)
	{
		boolean del;
		this.save=this.start;
		for (;save!=null;save=save.next)
		{
			Iterator foo = c.iterator();
			del = false;
			while(foo.hasNext()&& (del == false))
			{
				if ((save.value).equals(((Knot)foo.next()).value))
						del=true;
			}
			if (del)
			remove(save.value);
		}
		return true;
		
	}
	
	public int size()
	{
		return counter;
	}
	
	public Object[] toArray()
	{
		Knot foo = start;
		int i=0;
		for (i=0;foo!=null;i++,foo=foo.next);
		Object[] array= new Object[i];
		for (i=0;foo!=null;i++,foo=foo.next)
		{
			array[i]=foo.value;
		}
		return array;
	}
	
	public Object[] toArray(Object[] a)
	{
		return a;
		
	}
	
	
	
	
	
}

puh naja vielleicht kann mir ja jemand helfen... :confused:
 
next() eines Iterator setzt den internen "Zeiger" des Iterator weiter, daher sollte man die Methode nur einmal innerhalb eines Schleifendurchlaufs aufrufen:
Code:
//...
                while(foo.hasNext()) {
                    Object o = foo.next();
                    if (o!=null) {
                        remove(foo.next());
                    }
		}
//...
 
Ja das stimmt, aber in diesem Fall erzeugt mein code eine Dauerschleife und geht nie wieder aus removeAll raus...
 
Dann versuche mal, statt remove aufzurufen, erstmal nur eine Ausgabe zu machen, damit Du eingrenzen kannst, wo die Endlosschleife entsteht:
Code:
//...
                while(foo.hasNext()) {
                    Object o = foo.next();
                    if (o!=null) {
                        syste...println(o);
                        //Sorry, dank Eclipse' autocompletion,
                        //kann ich das nicht mehr ohne Hilfe 
                        //schreiben.
                    }
		}
//...
 
Ich würde die Methode erstmal vereinfachen:

Code:
public boolean removeAll (Collection c)
	{
if (c == null) return false;
boolean b = true;
Iterator foo = c.iterator();
		while(foo.hasNext())
		{
if (!remove(foo.next())) b = false;
}
		return b;
	}
 
Hmm, danke für die Hilfe erstmal...
habe alle eure tips berücksichtigt

so sieht es jetzt aus:
Code:
while(foo.hasNext()) {
            Object o = foo.next();
            if (o!=null) {
                remove(foo.next());
            }else 
				return false;
		}return true;
allerdings habe ich jetzt das Problem (erkenne ich mit dem debugger)
das richtig alle entfernt werden, aber dann beim letzten gibt er wieder eine nullpointer EXc
und zwar im Iterator
Code:
public Object next()	
	{
		
		Object ob = null;
		
		if (current.value != null)	// <---- genau hier   
		{
			ob = current.value;
			current = current.next;
			return ob;
		}	else	
		{
			return null;
		}
	}
Dabei ist es nur eine if abfrage...?

*edit 0.1
Kann ich da einfach die exception einfach abfangen? aber warscheinlich löst es das Problem nicht?!

*edit 0.2
Aber wenn ich es jetzt nochmal ausgebe, gibt er alle objekte aus, die ansonsten removed werde... sprich, wenn ich dannach die exception abfange sind die obj. schon verschwunden?
 
Zuletzt bearbeitet:
Dann sicher Dich doch ab (wenn ansonsten alles richtig ist):
Code:
		if (current!=null && current.value != null)
Da scheinbar das Element current null ist und dieses das letzte Element ist, vermute ich, dass entweder ein (leeres) Element zuviel eingefügt wurde oder der Iterator (ist das Dein Iterator oder kommt der von einer Sun-List?) bei hasNext() zu spät false zurückgibt.

Gruß hpvw
 
So es funktioniert jetzt...
Leider habe ich gerade festgestellt, das die objekte nicht sortiert sind...
aber das schaffe ich jetzt auch noch...
Dankeschön
 
Zurück