Iterator für eine geordnete Menge

Bitte aktiviere JavaScript!
Zu Anfang ist current=anchor
hasNext prüft dann, ob es noch einen Nachfolger gibt, next gibt dann aber den aktuellen Wert von current (also im ersten Aufruf anchor) zurück.
Zu Anfang ist current=anchor
hasNext prüft dann, ob es noch einen Nachfolger gibt, next gibt dann aber den aktuellen Wert von current (also im ersten Aufruf anchor) zurück.

:( so ein misst vergessen! Danke für die Hilfe :)

Dann nehme ich einfach alles von @Tobias-nrw ;)

LG
 
Variablen heißen jetzt xXge93nd = a, current = za2g9dna :D Besser? :D:D
Nop.

Versuchs einfach noch mal selbst, wenn es nur um den Iterator geht, ist das wirklich nicht schwer.

remove(object o) im Iterator ist also eh Sinnfrei! Doch wenn ich Ihn einbauen würde könnte ich das von mir nehmen oder :O
Wenn du das wieder einbaust, wird man dir wieder sagen, dass es da nicht hingehört ¯\_(ツ)_/¯

Die Methode hat da einfach nichts zu suchen, die ist dort völlig sinnlos.
 
@mrBrown Habe mal folgendes geändert:
1. remove nicht vollständig im Iterator,
2. eigene Methode für remove im LinkedSet,
3. nach wie vor wird bei remove (noch) der Iterator verwendet.

Java:
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.StringJoiner;

public class LinkedSet<T extends Comparable<T>> implements SortedSet<T> {
	public static void main(String[] args) {
		LinkedSet<Integer> s = new LinkedSet<>();
		System.out.println(iterToString(s.iterator()));
		for (int i = 0; i < 10; i++) {
			s.add((int) (Math.random() * 5.0));
			System.out.println(iterToString(s.iterator()));
		}

		s.clear();
		System.out.println(iterToString(s.iterator()));
		for (int i = 0; i < 10; i++) {
			s.add((int) (Math.random() * 5.0));
			System.out.println(iterToString(s.iterator()));
		}
	}

	public static String iterToString(Iterator<?> i) {
		StringJoiner j = new StringJoiner("; ");
		j.setEmptyValue("");
		while (i.hasNext())
			j.add(i.next().toString());
		return j.toString();
	}

	private class Cell {
		Object value;
		Cell pred, succ;
	}

	private Cell anchor;

	public LinkedSet() {
		anchor = new Cell();
		anchor.pred = anchor;
		anchor.succ = anchor;
	}

	public Iterator<T> iterator() {
		return new Iterator<T>() {
			Cell a = anchor;
			boolean b = true;

			@Override
			public boolean hasNext() {
				if (b && a.succ == anchor) {
					b = false;
					return a.value != null;
				}
				return b && a.value != null;
			}

			@SuppressWarnings("unchecked")
			@Override
			public T next() {
				T t = (T) a.value;
				a = a.succ;
				return t;
			}

			@Override
			public void remove() {
				LinkedSet.this.remove(a.pred);
			}
		};
	}

	@SuppressWarnings("unchecked")
	public boolean add(T e) {
		if (e == null) {
			throw new NullPointerException();
		}

		if (isEmpty()) {
			anchor.value = e;
		} else if (contains(e)) {
			return false;
		} else if (((Comparable<T>) e).compareTo((T) anchor.value) < 0) {
			anchor = insertBefore(anchor, e);
		} else {
			Cell current = anchor.succ;
			while (current != anchor && ((Comparable<T>) current.value).compareTo(e) < 0) {
				current = current.succ;
			}
			insertBefore(current, e);
		}
		return true;
	}

	private Cell insertBefore(Cell cell, T e) {
		Cell result = new Cell();
		result.value = e;
		result.pred = cell.pred;
		result.succ = cell;
		cell.pred.succ = result;
		cell.pred = result;
		return result;
	}

	@Override
	public boolean addAll(Collection<? extends T> c) {
		for (T t : c) {
			add(t);
		}
		return true;
	}

	@Override
	public void clear() {
		anchor.pred = anchor;
		anchor.succ = anchor;
		anchor.value = null;
	}

	@Override
	public boolean contains(Object o) {
		Iterator<T> i = iterator();
		while (i.hasNext())
			if (i.next().equals(o))
				return true;
		return false;
	}

	@Override
	public boolean containsAll(Collection<?> c) {
		for (Object o : c) {
			if (!contains(o))
				return false;
		}
		return true;
	}

	@Override
	public boolean isEmpty() {
		return anchor.value == null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public boolean remove(Object o) {
		Iterator<T> i = iterator();
		while (i.hasNext())
			if (i.next().compareTo((T) o) == 0) {
				i.remove();
				return true;
			}
		return false;
	}

	private void remove(Cell c) {
		Cell a = c.succ;
		if (size() == 1) {
			a.value = null;
		} else {
			if (a.pred == anchor) {
				anchor = a;
			}
			a.pred.pred.succ = a;
			a.pred = a.pred.pred;
		}
	}

	@Override
	public boolean removeAll(Collection<?> c) {
		boolean b = true;
		for (Object o : c) {
			if (!remove(o)) {
				b = false;
			}
		}
		return b;
	}

	@Override
	public boolean retainAll(Collection<?> c) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public int size() {
		if (isEmpty())
			return 0;
		int s = 0;
		Iterator<?> i = iterator();
		while (i.hasNext()) {
			s++;
			i.next();
		}
		return s;
	}

	@Override
	public Object[] toArray() {
		Object[] a = new Object[size()];
		int j = 0;
		Iterator<T> i = iterator();
		while (i.hasNext())
			a[j++] = i.next();
		return a;
	}

	@SuppressWarnings({ "hiding", "unchecked" })
	@Override
	public <T> T[] toArray(T[] a) {
		T[] b = (T[]) Array.newInstance(a.getClass().getComponentType(), size());
		int j = 0;
		Iterator<T> i = (Iterator<T>) iterator();
		while (i.hasNext())
			b[j++] = i.next();
		return b;
	}

	@Override
	public Comparator<? super T> comparator() {
		return (T a, T b) -> a.compareTo(b);
	}

	@SuppressWarnings("unchecked")
	@Override
	public T first() {
		return (T) anchor.value;
	}

	@Override
	public SortedSet<T> headSet(T arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public T last() {
		return (T) anchor.pred.value;
	}

	@Override
	public SortedSet<T> subSet(T fromElement, T toElement) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public SortedSet<T> tailSet(T fromElement) {
		// TODO Auto-generated method stub
		return null;
	}
}
 
@mrBrown Habe mal folgendes geändert:
1. remove nicht vollständig im Iterator,
2. eigene Methode für remove im LinkedSet,
3. nach wie vor wird bei remove (noch) der Iterator verwendet.
Na da war die vorherige Lösung aber schöner ;)


Was aktuell nicht nach Doku implementiert ist, sind
  • last: muss NoSuchElementException werfen
  • first: muss NSEE werfen
  • comparator: muss in diesem Fall null zurückgeben
  • toArray(T): neues Array darf nur erstellt werden, wenn übergebenes zu klein
  • contains: muss compareTo nutzen
  • Iterator#next: muss NSEE werfen
  • Iterator#remove: muss IllegalStateException werfen
Und halt die nicht implementierten Methoden
 
Wenn die Aufgabenstellung so wäre das man einen Iterator mit der Methode remove(Object) Implementieren müsste :D wäre dann meine Okay? :)

und die anderen Methoden hasNext und Next() könne ich ja auch von dir nehmen okay :)
Eine andere Lösung fällt mir dort jetzt nicht ein.

Ich hätte aber noch eine Ähnliche Aufgabe wie diese hier und eine Frage vor ab. Darf ich wenn eine Klasse implements Collection im Iterator die Methoden bentuzen also wie z. B. to Array und isEmpty? Bestimmt oder :p

Ich danke euch nochmals ganz Herzlich für euren vielen Beiträgen :) super "Daumen Hoch =)"
 
Wenn die Aufgabenstellung so wäre das man einen Iterator mit der Methode remove(Object) Implementieren müsste :D wäre dann meine Okay? :)
Keine Ahnung, das müsstest du dann den hypothetische Aufgabensteller fragen :p

und die anderen Methoden hasNext und Next() könne ich ja auch von dir nehmen okay :)
Eine andere Lösung fällt mir dort jetzt nicht ein.
Wenn du die Lösung frei erklären kannst gerne - aber dann wäre es doch sicher auch kein Problem, das selbst zu schreiben ;)

Ich hätte aber noch eine Ähnliche Aufgabe wie diese hier und eine Frage vor ab. Darf ich wenn eine Klasse implements Collection im Iterator die Methoden bentuzen also wie z. B. to Array und isEmpty? Bestimmt oder :p
Ich würde sagen „ja“
 
Keine Ahnung, das müsstest du dann den hypothetische Aufgabensteller fragen :p
Okay dann lasse ich das raus! Ist ja normalerweise auch nicht drin :p

Ich würde sagen „ja“
Das hört sich gut an denn dann könnte man ja auch mit der toArray Methode sich ein Array im Iterator anlegen und über das Iterieren oder wäre das auch wieder FALSCH :(??

Wenn du die Lösung frei erklären kannst gerne - aber dann wäre es doch sicher auch kein Problem, das selbst zu schreiben ;)
Ich glaube das ich das nicht kann :( dann lasse ich das alles weg :p
Danke nochmals :)

LG
 
und die anderen Methoden hasNext und Next() könne ich ja auch von dir nehmen okay :)
Von meiner Seite aus stünde nix dagegen. :) Ich kann aber Fehler, trotz der Tests, nicht ganz ausschließen.


Darf ich wenn eine Klasse implements Collection im Iterator die Methoden bentuzen also wie z. B. to Array und isEmpty? Bestimmt oder
Kläre das am besten mit dem hypothetischen Aufgabensteller ab, wenn es nicht schon in der Aufgabe stünde...
 
So damit hat sich diese Aufgabe erst einmal Erledigt :)

Ich danke ganz Herzlich allen die sich die Mühe gemacht haben und mir so sehr geholfen haben DANKE :)
LG
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben