Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

aus der LinkedList auslesen

1 view
Skip to first unread message

Andre

unread,
Oct 22, 2005, 10:02:45 AM10/22/05
to
Hallo,
also ich sitz schon seit zwei Tagen an meinem Problem. Es geht darum ich
muss eine Verwaltung von Personen machen. Hab nun zwei Klassen für den
Anfang. Verwaltung und Person. Als Liste benutze ich LinkedList wo ich per
add an das ende der Liste was zufüge: nummer,name und vorname der Person.

Das Problem ist, ich wollte zur Sicherheit mal meine Liste auslesen was ich
mit getLast() versucht habe, bin eigentlich einige der Auslese befehle
durchgegangen.
Leider bekomme ich immer eine Fehlermeldung. Bei getLast() lautet diese:

java.util.NoSuchElementException
at java.util.LinkedList.getLast(Unknown Source)

kann mir jemand vielleicht behilflich sein und kurz erklären wie man aus der
LinkedList eingeschriebene Elemente auslesen kann?
Gruß

Endy


Lothar Kimmeringer

unread,
Oct 22, 2005, 10:08:40 AM10/22/05
to

Irgendwie schaut das ganze seltsam aus und Du solltest hier
mal den Sourcecode liefern, der der Liste etwas hinzufuegt
und wieder ausliest. Wenn Du per addLast(...) etwas rein-
schreibst, sollte bei getLast auch wieder etwas herauskommen.

Und als probierte ich folgendes:

-------- schnipp
import java.util.LinkedList;

public class TestLinkedList {

/**
*
*/
public TestLinkedList() {
super();
}

public static void main(String[] args) {
LinkedList ll = new LinkedList();
ll.addLast("Hallo");
System.out.println(ll.getLast());
}
}
-------- schnapp

Und beim Ausfuehren kommt wie erwartet
Hallo


Gruesse, Lothar
--
Lothar Kimmeringer E-Mail: spam...@kimmeringer.de
PGP-encrypted mails preferred (Key-ID: 0x8BC3CD81)

Always remember: The answer is forty-two, there can only be wrong
questions!

Tor-Einar Jarnbjo

unread,
Oct 22, 2005, 10:14:00 AM10/22/05
to
Andre wrote:

> java.util.NoSuchElementException
> at java.util.LinkedList.getLast(Unknown Source)

Die API-Dokumentation hätte dir sagen können, dass LinkedList#getLast
eine NoSuchElementException wirft, wenn die Liste leer ist. Anscheinend
hast du schon vorher in deinem Programmcode einen Fehler.

Gruß, Tor

Message has been deleted

Andre

unread,
Oct 22, 2005, 10:40:52 AM10/22/05
to
mir ist jetzt klar das ich wohl das ganze nicht richtig gemacht habe, wo der
fEhelr liegt weiss ich leider nu nicht.

import java.util.*;
import java.io.*;

public class Verwaltung {
private static int nr;
LinkedList fuege = new LinkedList();
Verwaltung(){}

private void eingabe()throws IOException{
....
}
public static void main(String args[]) throws IOException{
Verwaltung e = new Verwaltung();
e.eingabe();
}

private void personAnlegen() throws IOException{
Verwaltung e = new Verwaltung();
Person p = new Person();
BufferedReader angabe = new BufferedReader(new
InputStreamReader(System.in));
nummer++;
p.setPersonr(nummer);
System.out.print("Bitte geben sie den Namen ein: ");
String name = angabe.readLine();
p.setName(name);
System.out.print("Bitte geben sie den Vornamen ein: ");
String vorname = angabe.readLine();
p.setVorname(vorname);
n.add(p);
e.eingabe();
}

private void personAuflisten(){
System.out.println("Die in der Liste befindlichen Personen
lauten:");
for(int a = 0; a <=nummer;) {
System.out.println("Diese Person ist in der Liste: "
n.get(a));
a++;
}
}
...}

ich habe noch eine Klasser Person wodie Zuweisungen erfolgen.

meine Felermeldung lautet hierbei:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.LinkedList.entry(Unknown Source)
at java.util.LinkedList.get(Unknown Source)


Andre

unread,
Oct 22, 2005, 10:42:16 AM10/22/05
to
> http://www.galileocomputing.de/openbook/javainsel3/javainsel_110003.htm
> http://download.java.net/jdk6/docs/api/java/util/LinkedList.html
>
> Am besten, Du schreibst erst einmal ein kleines Programm,
> um nur die Zugriffe auf diese Liste auszuprobieren.


hast wahrscheinlich recht, erstmal schauen ob ich die Befehle auch richtig
anwenden kann:) richtig lesen heisst ja lang nicht richtig einsetzen.


Lothar Kimmeringer

unread,
Oct 22, 2005, 11:36:05 AM10/22/05
to
On Sat, 22 Oct 2005 16:40:52 +0200, Andre wrote:

> private void personAnlegen() throws IOException{
> Verwaltung e = new Verwaltung();
> Person p = new Person();
> BufferedReader angabe = new BufferedReader(new
> InputStreamReader(System.in));
> nummer++;

Beim Anlegen einer Person, wird die (globale? -> boese) Variable
um eins hochgezaehlt. Nach dem Anlegen der ersten Person steht
das Teil auf 1.

> for(int a = 0; a <=nummer;) {

Wenn eine Person eingefuegt wurde, laeuft diese Schleife
von 0 bis 1, also zweimal durch

> System.out.println("Diese Person ist in der Liste: "
> n.get(a));

Beim zweiten Durchlauf wirft das Teil dann eine Exception,
wobei bei einer ArrayList das eine IndexOutOfBoundsException
gewesen waere.

> a++;
> }

Du solltest ganz dringend an Deinem Programmierstil arbeiten:

- Wenn Du ueber die Elemente einer Liste laufen moechtest,
solltest Du die Methoden der Liste selbst verwenden, um die
Anzahl der Elemente herauszufinden (size()). Es waere
ja schliesslich moeglich, dass Personen aus der Liste ge-
loescht werden, so dass nummer nicht mehr die Anzahl an
Personen in der Liste repraesentieren kann.
- Wozu das hochzaehlen des Schleifenzaehlers innerhalb der^
for-Schleife und nicht - so wie es der Rest der Welt macht -
innerhalb des Schleifenaufrufs?

Noch ein paar Sachen:

> private void personAnlegen() throws IOException{
> Verwaltung e = new Verwaltung();

- Wozu wird da Verwaltung neu initialisiert?
- Wann wird personAnlegen aufgerufen?

> n.add(p);

Was ist n? Als Instanzvariable kann ich da nur "fuege" finden.

> e.eingabe();

Wozu wird das da nochmal aufgerufen?

> private void personAuflisten(){

Wo wird diese Methoden aufgerufen?

Andre

unread,
Oct 22, 2005, 1:33:06 PM10/22/05
to

>> for(int a = 0; a <=nummer;) {
also ich hab das bei mir im Programm schon auf a<nummer verbessert gehabt,
sorry. Habs falsch weitergegeben

> Wenn eine Person eingefuegt wurde, laeuft diese Schleife
> von 0 bis 1, also zweimal durch

> Du solltest ganz dringend an Deinem Programmierstil arbeiten:
ich lern schon zwei Monate aber anscheinend wa es nicht effektiv genug. Und
nun muss ich halt dieses Problem lösen könn:) Da kommen schon einige
Versuche die nicht grad Sinn haben, da man bekanntlich nicht alles aus den
Büchern versteht.

> - Wozu das hochzaehlen des Schleifenzaehlers innerhalb der^
> for-Schleife und nicht - so wie es der Rest der Welt macht -
> innerhalb des Schleifenaufrufs?

ich wollte nicht das bei n.get(a) das a schon eins hochgezählt wird , das
wohl wieder ein denkfehler ist, da wegen ++a a++ ich mir besser gedanken
hätte machen sollen.

>> private void personAnlegen() throws IOException{
>> Verwaltung e = new Verwaltung();
>
> - Wozu wird da Verwaltung neu initialisiert?
> - Wann wird personAnlegen aufgerufen?

die wird in der eingabe() aufgerufen, was ich wieder anscheinend evrgessen
habe hinzuschreiben.

>
>> n.add(p);
>
> Was ist n? Als Instanzvariable kann ich da nur "fuege" finden.

n sollte fuege sein

>> e.eingabe();
>
> Wozu wird das da nochmal aufgerufen?

damit ich einpaar personen nacheinander eingeben kann, wollt ich zum anfang
des Programs sprich eingabe


>> private void personAuflisten(){
> Wo wird diese Methoden aufgerufen?

die wird auch unter eingabe() aufgerufen.

ich merke, dass ich sehr schlecht schreibe um mir helfen lassen zu könn:)
Echt sorry. Ich werd mal einwenig nochmal alles durchdenken und evtl. bei
weiteren Fragen mich wieder hier melden:)
Stefans links scheien ganz gut zu sein, und per test programm von dir werde
ich erstmal durch kleine testphasen mal alles ausproibieren. Nicht direkt im
Program was ich ja später benötige.Manchmal tut man sich halt schwer ne:(

Gruß und dank

endy


Wanja Gayk

unread,
Oct 22, 2005, 2:30:33 PM10/22/05
to
Andre said...

>
> >> for(int a = 0; a <=nummer;) {
> also ich hab das bei mir im Programm schon auf a<nummer verbessert gehabt,
> sorry. Habs falsch weitergegeben

Das war nicht das, was Lothar meinte.

Lothar meinte, dass man eine Liste besser so abläuft:

for (int t = 0; t<liste.size(); ++t){
final Object obj = liste.get(t);
System.out.println(String.valueOf(obj));
}

> > Du solltest ganz dringend an Deinem Programmierstil arbeiten:

> ich lern schon zwei Monate aber anscheinend wa es nicht effektiv genug.

Ich behaupte eher dein Tutor ist unfähig, bzw. du hast keinen.

> > - Wozu das hochzaehlen des Schleifenzaehlers innerhalb der^
> > for-Schleife und nicht - so wie es der Rest der Welt macht -
> > innerhalb des Schleifenaufrufs?

> ich wollte nicht das bei n.get(a) das a schon eins hochgezählt wird , das
> wohl wieder ein denkfehler ist, da wegen ++a a++ ich mir besser gedanken
> hätte machen sollen.

Ob du ++a oder a++ nimmst, ist an dieser Stelle nicht deine Hauptsorge.

In Sachen "Programmierstil" wäre dir gesagt:

Halte Variablen möglichst lokal.

Also statt:
public class BadExample{

public int n;

public void foo(){
doSomething();
doSomethingElse();
}

public void doSomething(){
while(whatever){
doSomething();
++n;
}
}

public void doSomethingElse(){
for (int t = 0; t<n; ++t){
//blafasel;
}
}

}

lieber sowas:

public class BadExample{

public void foo(){
int n = doSomething();
doSomethingElse(n);
}

public int doSomething(){
int n;
while(whatever){
doSomething();
++n;
}
return n
}

public void doSomethingElse(int n){
for (int t = 0; t<n; ++t){
//blafasel;
}
}
}

Damit sind die Methoden voneinander unabhängig.
Wie auch oben gezeigt arbeite lieber mit Methoden, die eine Wert zurück
geben, statt dich auf "globale" Variablen zu verlassen.

Also statt:

class BadExample{

List liste = new ArrayList();

public void readFrom(File f){
//buffered reader, etc..
String s = reader.readLine();
liste.add(s);
//..bla
}
}

lieber:

class GoodExample{

public List readFrom(File f){
List liste = new ArrayList();
//buffered reader, etc..
String s = reader.readLine();
liste.add(s);
//..bla
return liste;
}

}

Damit wird die readFrom(..) methode nämlich wiederverwendbar.

Außerdem: Schmeiß nicht alles gemischt in eine Liste, sondern kapsel
deine Daten.

Also statt:
liste.add(name);
liste.add(strasse);
liste.add(stadt);

lieber:

liste.add(new Addresse(name, strasse, stadt));

Und zur Kapselung:

class Addresse {
public String name;
public String strasse;
public String stadt;
public Addresse(String name, String strasse, String stadt){
this.name=name;
this.strasse=strasse;
this.stadt=stadt;
}
}

damit musst du dich nicht mehr darum kümmern, beim Lesen aus der Liste
die Reihenfolge zu beachten (nebst anderen Vorteilen).

etc..

Gruß,
-Wanja-


--
"Gewisse Schriftsteller sagen von ihren Werken immer: 'Mein Buch, mein
Kommentar, meine Geschichte'. [..] Es wäre besser, wenn sie sagten:
'unser Buch, unser Kommentar, unsere Geschichte'; wenn man bedenkt, dass
das Gute darin mehr von anderen ist als von ihnen." [Blaise Pascal]

Malte Schneider

unread,
Oct 22, 2005, 3:11:05 PM10/22/05
to
Andre schrieb:

Ich nehme mal an, du hast dich für List entschieden, weil du eine
Ordered Collection brauchst, und die LinkedList Implementation, weil du
die Anzahl deiner Elemente vorher nicht weisst und auch nicht per Index
auf sie zugreifen musst.
Greif einfach über die Methoden des Collection-Interfaces auf sie zu.

list.add(element);
.
.
.
list.add(element);
.
.
.
.
Iterator it = list.iterator();
while (it.hasNext()){
DeineElementKlasse curr = (DeineElementKlasse)it.next();
// was auch immer du mit den Elementen machst
}

Malte

Andre

unread,
Oct 23, 2005, 8:41:00 AM10/23/05
to
danke für die Tipps, für die lokalen Variablen und das mit der Liste.
Nein ein Tut hab ich nicht, lerne es für mcih da ich das nun brauche:)


Andre

unread,
Oct 23, 2005, 8:44:00 AM10/23/05
to
> Ich nehme mal an, du hast dich für List entschieden, weil du eine Ordered
> Collection brauchst, und die LinkedList Implementation, weil du die Anzahl
> deiner Elemente vorher nicht weisst und auch nicht per Index auf sie
> zugreifen musst.
jup, sie muss flexibel also dynamisch sein könn.

> Greif einfach über die Methoden des Collection-Interfaces auf sie zu.
>
> list.add(element);

> list.add(element);


> Iterator it = list.iterator();
> while (it.hasNext()){
> DeineElementKlasse curr = (DeineElementKlasse)it.next();
> // was auch immer du mit den Elementen machst
> }
> Malte

werd ich versuchen, danke dir malte

endi


Wanja Gayk

unread,
Oct 23, 2005, 9:44:19 AM10/23/05
to
Andre said...

> danke für die Tipps, für die lokalen Variablen und das mit der Liste.
> Nein ein Tut hab ich nicht, lerne es für mcih da ich das nun brauche:)

Tipp:
Schaue dir ein paar Design Patterns an, die helfen dem Stil unglaublich
weiter und bieten Lösungsstrategien für übliche Probleme.

http://www.javacamp.org/designPattern/

Kurz und knackig beschrieben, das ist genau das was du brauchst, schätze
ich.

http://www.patterndepot.com/put/8/JavaPatterns.htm
Bei diesem Buch schreibt der Autor auch mal Klassennamen klein, das
solltest du dir nicht angewöhnen, ansonsten ist es relativ brauchbar,
schwafelt aber ein bissel viel und enthält IMO zu viel Swing-Zeug was
von den Patterns selbst ablenkt. Für mich zweite Wahl.

Gruß,
-Wanja-
p.s.:

Die Hinweise von http://www.learn.to/quote solltest du in deinen Usenet-
Postings dringend beachten, um die Threads weiterhin lesbar zu halten.

Außerdem wird es hier als höflich angesehen unter seinem vollen Namen zu
posten, es gibt hier mehrere die Andre heißen und die möchte man
auseinander halten können.

Deine Emailadresse ist hoffentlich auch gültig, denn ist sie es nicht,
so wird durch bouncende Mails teurer Traffic erzeugt, den Netzbetreiber
und damit auch Internetprovider über ihre Preise für Onlinezugänge
bezahlen lassen. Wenn du einen Spamsumpf brauchst, ist
https://mail.yahoo.com eine gute Adresse.

Andre

unread,
Oct 23, 2005, 11:08:31 AM10/23/05
to

> Tipp:
> Schaue dir ein paar Design Patterns an, die helfen dem Stil unglaublich
> weiter und bieten Lösungsstrategien für übliche Probleme.
>
> http://www.javacamp.org/designPattern/
mein English ist zwar nicht das beste aber ich geb mir Mühe und schau mir
das auch an:)

> Die Hinweise von http://www.learn.to/quote solltest du in deinen Usenet-
> Postings dringend beachten, um die Threads weiterhin lesbar zu halten.

anch diesem Posting lese ich das mal durch, da ich niemandem zumuten möchte
etwas zu lesen was nicht hierhin passt:)

> Außerdem wird es hier als höflich angesehen unter seinem vollen Namen zu
> posten, es gibt hier mehrere die Andre heißen und die möchte man
> auseinander halten können.

dachte Name reicht, sorry nomma.

> Deine Emailadresse ist hoffentlich auch gültig, denn ist sie es nicht,
> so wird durch bouncende Mails teurer Traffic erzeugt, den Netzbetreiber
> und damit auch Internetprovider über ihre Preise für Onlinezugänge
> bezahlen lassen. Wenn du einen Spamsumpf brauchst, ist
> https://mail.yahoo.com eine gute Adresse.

das hab ich mit dem bouncende Mails nicht ganz so verstanden, aber du kannst
gern das nachdem @ mal ausprobieren:) Die Addy ist gültig. Danke für die
Tipps.


Andre Tobac

Wanja Gayk

unread,
Oct 23, 2005, 11:10:34 AM10/23/05
to
Wanja Gayk said...

> http://www.javacamp.org/designPattern/
>
> Kurz und knackig beschrieben, das ist genau das was du brauchst, schätze
> ich

Zusatz:
> http://www.javaworld.com/javaworld/jw-12-2001/jw-1214-designpatterns.html?

Liest sich auch recht gut.

Gruß,
-Wanja-

Andre

unread,
Oct 23, 2005, 12:12:42 PM10/23/05
to

>> http://www.javacamp.org/designPattern/
>>
>> Kurz und knackig beschrieben, das ist genau das was du brauchst, schätze
>> ich
>
> Zusatz:
>> http://www.javaworld.com/javaworld/jw-12-2001/jw-1214-designpatterns.html?

am englischen kommt man wohl nicht vorbei:)


Wanja Gayk

unread,
Oct 23, 2005, 2:31:08 PM10/23/05
to
Andre said...

Nein, definitiv nicht. Alleine schon, weil die Java-API-Dokumentation in
Englisch gehalten ist.
Aber in Sachen Entwurfsmuster hilft dir vielleicht auch Wikipedia
weiter, wobei die Beispiele dort nicht auf Java beschränkt sind und die
sind Artikel sind oft sehr unvollständig.
http://de.wikipedia.org/wiki/Entwurfsmuster

Vielleich sollte ich mich mal ein wenig um die Vollständigkeit kümmern
:-).

Andre Tobac

unread,
Oct 23, 2005, 2:55:49 PM10/23/05
to

> Nein, definitiv nicht. Alleine schon, weil die Java-API-Dokumentation in
> Englisch gehalten ist.
> Aber in Sachen Entwurfsmuster hilft dir vielleicht auch Wikipedia
> weiter, wobei die Beispiele dort nicht auf Java beschränkt sind und die
> sind Artikel sind oft sehr unvollständig.
> http://de.wikipedia.org/wiki/Entwurfsmuster
>
> Vielleich sollte ich mich mal ein wenig um die Vollständigkeit kümmern
> :-).

sonst schau ich mir wiki auch oft an aber bei java ist mir das nie
inegefallen:) DAs problem ist wohl auch das ich nun das ganze von 50 auf
direkt 180 bringe muss, da es erforderlich ist. DA macht man schon schnell
Fehler gelle:)

Aber danke dir für den Rat und tat:)

Und schlimm wäre Wiki zu vervollständigen nicht:)


Andre Tobac

unread,
Oct 23, 2005, 5:18:48 PM10/23/05
to
> - Wenn Du ueber die Elemente einer Liste laufen moechtest,
> solltest Du die Methoden der Liste selbst verwenden, um die
> Anzahl der Elemente herauszufinden (size()). Es waere
> ja schliesslich moeglich, dass Personen aus der Liste ge-
> loescht werden, so dass nummer nicht mehr die Anzahl an
> Personen in der Liste repraesentieren kann.
> - Wozu das hochzaehlen des Schleifenzaehlers innerhalb der^
> for-Schleife und nicht - so wie es der Rest der Welt macht -
> innerhalb des Schleifenaufrufs?

danke für die Hilfen, und die erklärungen. Mit size und der Lsite klappt es
nun besser. Denke das neue prog ist besser:)
Bekomme jetzt die Listen jedenfalls hin wobei ich aber Vector benutze

Endi


0 new messages