Liste

rokko123

Mitglied
Hey,

Java:
package;

import java.util.NoSuchElementException;
import list.List;

public class Lists {	
	/**
	 * Returns a string representation of the list.
	 * 
	 * @return a comma-separated list of the list values
	 */
	public static String toString(List list)
	{
		if (list == null) return "null";
		
		StringBuffer buf = new StringBuffer();
		buf.append(list.value).append(", ").append(toString(list.next));
		return buf.toString();
	}
	
	/**
	 * Adds a value to at the beginning of a list.
	 * 
	 * @param list the list to which the value is added
	 * @param value the value which is added to the list
	 * @return a new list with the new element first followed by the given list
	 */
	public static List add(List list, int value)
	{
		int i;
		for (i=0; i<=20; i++){
		list.add(i);
		return list;
		}
	}

Ich soll für eine Liste die add methode machen, "public List add(List list, int value)" ist vorgegeben, aber ich finde einfach nirgends was add(List list, zu bedeuten hat. Bis jetzt dachte ich bei add wird zuerst angegeben wo es eingefügt werden soll und dann was eingefügt werden soll, also z.b. int value

nur mit diesem List list komm ich auf keinen grünen Zweig, suche schon die ganze Zeit im Netz wie das zu verstehen ist, aber bin leider nicht fündig geworden... da hab ich mir gedacht schreib ichs mal hier hin, vielleicht kann hier einer einem mega-noob helfen und mir erklären was es mit List list auf sich hat ???:L
 
Zuletzt bearbeitet:
die Doku
> Adds a value to at the beginning of a list.
+
> @param list the list to which the value is added
+
> @param value the value which is added to the list
+
> @return a new list with the new element first followed by the given list

sagt dir rein gar nichts? das erklärt doch im Gegenteil alles genauestens, jedenfalls was rauskommen soll,
besonders wenn man noch dazu weiß, dass es eine verkettete Liste ist, erwähnst du nicht gerade ausführlich,
kommt mir aber irgendwie alles bekannt vor, erkennt man auch an der toString()-Methode

du musst einen neuen Listen-Kopf erstellen, darin der Value, und die Rest-Liste, der übergebene Parameter, hinten dran,

mit einer Schleife und
> list.add(i);
hat das wohl wenig zu tun
 
was ich machen soll ist mir schon klar, aber die umsetzung ist dann nochmal was ganz anderes 🙂

Finde irgendwie auch keine wirklich gute Beschreibung von dem Thema, mag aber dran liegen, dass mir wohl noch bisschen Grundwissen fehlt über Klassen/Methoden und ich da ein grausames durcheinander fabriziere.

Habs heute versucht, aber Eclipse wirft nur mit roten Linien um sich, wird wohl noch was dauern 😳
 
Okay, also was du machen sollst ist:
- Nehme eine alte Liste entgegen
- Nehme einen Wert entgegen
- Erstelle eine neue (new verwenden) Liste
- füge dieser den Wert an erster Stelle ein
- füge anschließend die Elemente der alten Liste in die neue Liste ein

Da bleiben aber noch fragen: List ist dann sicher das Interface [JAPI]List[/JAPI]. Demnach kannst du auch [JAPI]LinkedList[/JAPI] oder [JAPI]ArrayList[/JAPI], als neue Liste nehmen.

Wenn du da nun eine LinkedList nimmst, dann kannst du ganz einfach addFirst() verwenden um einen Wert an die erste Stelle zu bekommen 🙂
 
Java:
package list;

/**
 * Linked list with int values.
 * 
 * The empty list is represented by a null reference.
 */
public class List {
	public int value;
	public List next;

	/**
	 * Creates a new list
	 * 
	 * @param value value of the head of the list
	 * @param next reference to rest of the list; may be null
	 */
	public List(int value, List next) 
	{
		this.value = value;
		this.next = next;
	}	
}

Des is ja das was am Anfang importiert wird, aber wenn ich dann in der andern Datei versuch mit new List(); eine neue Liste zu erstellen, dann sagt mir eclipse, dass der Konstruktor List() nicht definiert sei, doch da ists doch definiert mit public List(int value, List next)?

Edit:

Java:
                List list2 = new List(0,null);
		list2 = Lists.add(list, 1);
		
		return list2;

Jetzt hab ich das so, die neue Liste besteht da ja nur aus Kopf und Ende, und next würde dann ja auf null zeigen, aber ob das mit der 0 stimmt bin ich mir nicht ganz sicher, ich versuchs jetzt mal so weiterzukommen, List(); war wohl undefiniert weil da nicht drinstand, was drinstehen sollte, ne?^^

ich stell mich auch blöd an, aber jeder fängt mal klein an 🙁


Edit:

Und jetzt fabrizier ich nen StackOverflowError

Java:
	List list2 = new List(0 ,null);
		List list3 = new List(0, null);
		list2 = Lists.add(list, 1);
		list3 = Lists.add(list2, 2);
		
		
		
		return list3;

bzw brauch ich da überhaupt list2 und list3 explizit anzugeben, das soll ja ne Methode werden fällt mir grad auf, die sollte dann ja auch auf andere listen anwendbar sein, so würds mir wohl den Junit test sowieso nicht bestehen -.-
 
Zuletzt bearbeitet:
besteht eine Frage? klingt ja alles sehr wirr,
man kann wenig wissen aber sollte doch zumindest Postings übersichtlich schreiben,
geht es um die add-Methode am Anfang?
was planst du bzw. wurde ja auch schon gesagt, welcher Code gehört zu welchem Gedanken?
 
So wie List hier definiert ist, kannst du niemals eine leere Liste haben, das ist schonmal doof.

Wie dem auch sei, [c]add[/c] kann man so scheiben:

Java:
public static List add(List list, int value) {
   return new List(value, list);
}
 
Glaub ich iwi fast nicht dass das mit so einem einzeiler gelöst werden kann, aber junit wird erfüllt :autsch:

und sry fürs unübersichtliche schreiben, werds in Zukunft versuchen besser zu machen
 
Zuletzt bearbeitet:
Java:
	/**
	 * Retrieves the size of a list.
	 * 
	 * @param list the list in question
	 * @return the number of values in the list.
	 */
	public static int size(List list)
	{
		if (list == null){
			
			return 0;
		}else{
			return size(list);
		}

Wie krieg ich jetzt die grösse der Liste raus, wenn ich das so mach wie oben, dann krieg ich einen StackOverflowError, seh aber irgendwie den Grund nicht.

Erst schau ich, ob die liste leer ist und wenn sie das nicht ist, dann soll mir size(list); die anzahl werte der liste liefern

size() ist doch bei listen, wie bei Arrays array.length, das kann man doch normal ohne probs nutzen? :/
 
Du rufst die Methode jedes mal genau so auf, ohne die Parameter zu verändern.
Du möchtest vermutlich eher
Code:
size(list.next)
verwenden und auch überlegen was du mit dem Ergebnis noch anstellen musst.
 
Du erzeugst dadurch ne Endlosschleife.

Wenn du das rekursiv lösen willst dann wäre folgendes denkbar:

Code:
int size (liste) : 
Wenn liste == null return 0;
Sonst return 1 + size(liste.next);
Damit navigierst du dann bis ans Ende der Liste und zählst jeweils immer eins hoch.
 
Java:
public static int size(List list){
   return list == null ? 0 : 1 + size(list.next);
}
 
Danke Danke 🙂

Das mit size() hat geklappt, die summe der Elemente hab ich auch hingekriegt

Java:
public static int sum(List list)
	{
		if (list == null){
			return 0;
		}else{
			return list.value + sum(list.next); 
		}
	}

grade sitz ich an ner möglichkeit das letzte Element auszugeben, mal schauen wies läuft 🙂
 
Java:
private void checkLast(List list, String expected)
	{
		check(Lists.last(list), expected);
	}
	
	@Test
	public void last()
	{
		checkLast(null, "null");
		checkLast(create(1), "1, null");
		checkLast(create(1,2), "1, null");
		checkLast(create(1,2,3), "1, null");
	}

ich sollte ja das letzte element meiner Liste ausgeben, und dann sollte es diesen test bestehen, nur versteh ich das nicht.

wenn da create(1,2,3) steht, wie kann dann "1,null" als das letztes Element erwartet werden, müsste dann ja 3 sein? oO

Java:
public static List last(List list) 
    {
			if (list != null) {
			if (list.next == null){
			}
			return (list.next);
			} else { 
				return list;
			}

				
			}

So hat ich mir das gedacht, dass wenn list.next auf null zeigt, dass ich ja dann theoretisch am Ende der Liste sein müsste und dann list.next ausgeben könnte und sonst einfach die leere liste ausgebe, aber das erfüllt mir wie gesagt den Test nicht und da ich den Test nicht durchblicke, komm ich auch da nicht wirklich weiter
 
Zuletzt bearbeitet:
create ist eine hier im Forum unbekannte Methode, oder?
wenn man bedenkt, dass add() vorne anfügt, ist es nicht ganz unwahrscheinlich, dass der erste Wert 1 am Ende der letzte in der Liste ist,

dass die null immer noch dranhängen soll sieht in in der Tat komisch aus, aber was soll man dazu sagen?
du postest ja auch keine Aufgabenstellung oder irgendwelche Hinweise die man noch auswerten könnte

so wie es aussieht soll deine Methode dann entweder "null" oder den letzten Wert + ", null" hinten dran zurückgeben,
das umzusetzen sollte möglich sein
 
Hab das mal sortiert:
Java:
if (list != null) {
	if (list.next == null)
	{
		
	}
	return (list.next);
} else { 
	return list;
}
Fällt dir was auf? Der else-Zweig scheint mir ziemlich sinnfrei, warum willst du eine Liste, die augenscheinlich
Code:
null
ist, zurückgeben. Abgesehen davon: ein leerer Codeblock sieht ziemlich doof aus, dreh das Ganze doch einfach um:
Java:
if (list.next != null) return list.next
Da stellt sich natürlich die Frage, was wird zurückgegeben, WENN
Code:
list.next == null
ist?
 
Ich wollte die leere liste zurückgeben, weil das ja im junit-test verlangt ist, da wird ja auch auf null geprüft.


und wenn ich im Junit-test die 3 checks nach dem null-check auskommentiere, dann wird mir der test erfüllt, also der eine teil, mit der leeren liste scheint ja dann doch iwi zu funktionieren? oder seh ich da was falsch
 
> also der eine teil, mit der leeren liste scheint ja dann doch iwi zu funktionieren? oder seh ich da was falsch

scheint zu funktionieren, ja

die Richtung
> if (list.next != null) return list.next
kann sicherlich noch nicht das Ziel sein,
man muss erst die gesamte Liste durchsuchen und erst das letzte Element ist gut

wenn man noch die anfangs gepostete toString()-Methode bedenkt, dann kommt die Ausgabe mit ", null" doch gut hin oder?
hast du im ganzen Thread bisher noch keine Listen ausgegeben, bzw. die gepostete toString()-Methode genutzt?
JEDE Ausgabe endet anscheinend mit ", null", insofern der Test korrekt

du musst das letzte Listenelement als einzelne Liste zurückgeben
 
du gibst eine Liste zurück, die check-Methode nutzt anscheinend dann toString(),
klappt auch für null
 
Java:
package list;

import org.junit.Assert;


import u5a1.Lists;

public class Tests {
	public void check(List list, String expected) 
	{ 
		Assert.assertEquals(expected, Lists.toString(list));	
	}
	
	public List create(int... values) 
	{
		List list = null;
		for (int i=0; i<values.length; i++) {
			list = Lists.add(list, values[i]);
		}
		return list;
	}
}

Jenau, da stehts ja sogar
 
kann ich das auch irgendwie mit meiner size() methode machen? quasi dass mir das element an der stelle size(list)-1 angegeben wird?
weil ich komm einfach nicht weiter, entweder bekomm ich die ganze liste zurück oder ich krieg ne Fehlermeldung NullPointerException.

wie ich das mit list.next hinkriegen soll ist mir echt ein rätsel
 
mit Indexen zu arbeiten müsstest du wohl genauso implementieren wenn noch nix da ist, kannst du ja machen, aber spart nicht nichts,

poste doch deinen Code wenn es einen Fehler gibt, welch grundlegender Zusammenhang, an den immer wieder zu erinnern ist..

> wie ich das mit list.next hinkriegen soll ist mir echt ein rätsel

list.next liefert das nächste Element, damit zum Ende der Liste zu gelangen,
was du quasi schon in allen bisherigen Methoden genauso machst ist dir ein Rätsel?

oje, aber immerhin bringt die Aufgabe dann noch was (wenn auch vielleicht nicht für lange),
hab mich schon gewundert warum man hier 5x dasselbe machen soll..
 
Java:
	public static List last(List list) 
    {
			   if (list == null)
				   return null;
			   if (list.next == null) 
				   return list;
			   
			   return last(list.next);
			}

mich hats einfach verwirrt weil ich mit list.next == null nicht ans ziel gekommen bin, obwohl das ja dann eigentlich am ende der Liste sein müsste
 
der Code dürfte doch stimmen, oder gibt es da nun die NullPointerException?
in jedem Posting für Klarheit sorgen, ein ehres Ziel
 

Zurück
Oben