Operationen einfach verketteter Listen

Hacer

Aktives Mitglied
Hallo!!
Ich habe bald eine Klausur in Programmierung und versuche schon seit gestern eine Altklausur zu lösen und zwar geht es hier um die Methoden split und checkAvailability. Weil ich noch nie eine main Methode erstellt habe, weiß ich nicht ob mein Code richtig ist oder nicht.


Java:
public class Train {
    private Coach firstCoach= null;
    private Coach lastCoach = null;
   
    public void append(Coach c){
        if(firstCoach== null){
            firstCoach= lastCoach=c;
        }else{
            lastCoach.setNext(c);
            lastCoach=c;
        }
    }
    public void remove(){
        if(firstCoach == null){
            return;
        }
        if(firstCoach.getNext()==null){
            lastCoach= firstCoach= null;
        }else{
            lastCoach= firstCoach;
            while(lastCoach.getNext().getNext()!=null){
                lastCoach =lastCoach.getNext();
            }
            lastCoach.setNext(null);
        }
    }
    public Train split(int n){
        Coach pointer = firstCoach;
        Train neuerZug = new Train();
        while(pointer!=null ){
            pointer= pointer.getNext();
            neuerZug.append(pointer.getNext());
            pointer.setNext(null);
        }
        //neuerZug.append(pointer.getNext());
        //pointer.setNext(null);
        return neuerZug;
    /*    for(int i=0; i<n; i++){
            pointer =pointer.getNext();
            Train neuerZug = new Train();
            neuerZug.append(pointer.getNext());
            pointer.setNext(null);
            return neuerZug;
        }*/
   
       
    }
    public boolean CheckAvailability(int[] passengers){
        int kapazitätWaggon =50;
        Coach pointer = firstCoach;
        for(int i=0; i<passengers.length;i++){
            if(passengers[i]>kapazitätWaggon ||getSize()< passengers.length){
                return false;
            }else{
                if(passengers[i]<kapazitätWaggon&& passengers[i]+pointer.getNumberOfPassengers()>kapazitätWaggon){
                    return false;
                }
                pointer=pointer.getNext();
            }
           
        }
        return true;
        /*if(firstCoach!=null){
            Coach pointer = firstCoach;
            for(int i =0; i<passengers.length;i++){
                if(passengers[i]+ pointer.getNumberOfPassengers()>50){
                    return false;
                    pointer=pointer.getNext();
                }
            }
        }
        return true;*/
       
    }
    public int getSize(){
        if(firstCoach==null){
            return 0;
        }
        int size=0;
        Coach pointer= firstCoach;
        while(pointer!=null){
            size++;
            pointer=pointer.getNext();
        }
        return size;
    }
 

Bitfehler

Bekanntes Mitglied
Eine main-Methode sehe ich in deinem Code nicht.
Bitte stell die Frage konkreter, mir ist unklar was du wissen willst.
Übersetzt dein Code? Schon mal ausgeführt und geguckt, was passiert? Passiert das, was passieren soll?
 

Hacer

Aktives Mitglied
@Bitfehler ich kann keine main- Methoden erstellen.
Bei der split-Methode muss man einen Zug auf die ersten n Waggons in unveränderter Reihenfolge verkürzen und einen neuen Zug mit den übrigen Waggons erstellen.

Bei der CheckAvalaibility Methode muss man überprüfen, ob es genug Plätze im Waggon gibt und jeder Waggon hat die Kapazität 50. Das Array gibt die Anzahl an Passagieren, die eingefügt werden sollen an.
 

Bitfehler

Bekanntes Mitglied
Split erscheint mir beim groben drüber gucken falsch.
Probiere doch einfach mal deinen Code aus, dann wirst du sehen, was da wahrscheinlich schief gehen wird.

Bei der anderen Methoden erschließt sich mir die for-Schleife noch nicht. Wenn es mehr Passagiere gibt, als es Plätze gibt, brauche ich das doch nicht für jeden Passagier prüfen. Abgesehen davon, dass da eh ein return ist.
 

Hacer

Aktives Mitglied
@Bitfehler erstmal danke für die Antwort. Würde es dann gehen, wenn ich die for-Schleife weglasse und statt: if(passengers>kapazitätWaggon ||getSize()< passengers.length)
if(passengers[0]>kapazitätWaggon) schreibe?
 

Jardcore

Top Contributor
Wie wäre es wenn du uns einmal die Aufgabenstellung beschreibst, dann könnten wir vielleicht auch genau darauf eingehen. Es kann ja sein, das dein Code die Aufgabenstellung schon falsch interpretiert.
 

VfL_Freak

Top Contributor
Moin,
Würde es dann gehen, wenn ich die for-Schleife weglasse
von welcher FOR-Schleife reden wir hier?
Der anfangs Auskommentierten?
Die wird eh' nie durchlaufen, da davor ein RETURN steht !!

und statt: if(passengers>kapazitätWaggon || getSize()< passengers.length)
if(passengers[0]>kapazitätWaggon) schreibe?
Der Wert von passengers[0] hat doch wohl nichts mit der Kapazität des Waggons zutun ...

So ganz verstehe ich auch nicht, was Du eigentlich willst/sollst ... :rolleyes:

Gruß Kalus
 

Hacer

Aktives Mitglied
MOIN!!
@Jardcore @VfL_Freak
Also hier ist die Aufgabenstellung. Die Lösung die dadrunter steht, ist nicht von mir.
 

Anhänge

  • IMG-20160705-WA0001.jpg
    IMG-20160705-WA0001.jpg
    65 KB · Aufrufe: 32
  • IMG-20160705-WA0001.jpg
    IMG-20160705-WA0001.jpg
    65 KB · Aufrufe: 25

Jardcore

Top Contributor
Aus der Aufgabenstellung lese ich folgendes. Und hier eine Möglichkeit dies umzusetzen.
Java:
public boolean checkAvailability(int[] passengers) {
        Coach currentCoach = firstCoach;
        int index = 0;
        int maxPassangersPerCoach = 50;
   
        while(currentCoach != null) {
            // not enought coaches
            if(passengers.length < index + 1) {
                return false;
            }
       
            int passengersCount = passengers[index];
       
            // reached capacity
            if(passengersCount + currentCoach.getNumberOfPassengers() > maxPassangersPerCoach) {
                return false;
            }
       
            currentCoach = currentCoach.getNext();
            index++;
        }
   
        // everything is fine
        return true;
    }
Und hiermit hab ichs getestet.
Java:
public class TestTrain_checkAvailability {
    private Train train = new Train();

    @Before
    public void before() {
        int numberOfCouches = 5;
        for(int i = 0; i < numberOfCouches; i++) {
            // append empty couches
            train.append(new Coach(0));
        }
    }

    @Test
    public void testNotEnoughtCouches() {
        int[] passengers = new int[] { 1 };
        assertThat(train.checkAvailability(passengers), is(false));
    }

    @Test
    public void testEnoughCapacityForPassengers() {
        int[] passengers = new int[] { 1, 10, 10, 10, 10 };
        assertThat(train.checkAvailability(passengers), is(true));
    }

    @Test
    public void testNotEnoughCapacityForPassengers() {
        int[] passengers = new int[] { 1, 51, 10, 10, 10 };
        assertThat(train.checkAvailability(passengers), is(false));
    }
}

Übrigens kannst du, wenn du Eclipse verwendest einfach "main" schreiben und dann Strg+Leertaste drücken und hast deine fertige main()-Methode :p
 

Hacer

Aktives Mitglied
@Saheeda weil wir immer main- Methoden zur Verfügung gestellt bekommen haben. Ich habe zwar versucht eine main-Methode zu erstellen war da nicht so erfolgreich. Da kam dann split trainTrain@4e2c390c raus
Java:
public static void main(String[] args){
        Train train = new Train();
       

        System.out.printf("split train", train.split(3));
        Coach coach1 = new Coach(20);
        Coach coach2 = new Coach(30);
        Coach coach3 = new Coach(40);
        Coach coach4 = new Coach(20);
       
        train.append(coach1);
        train.append(coach2);
        train.append(coach3);
        train.append(coach4);
       
        Train train2 = train.split(2);
        System.out.println(train);
       
    }
 

Joose

Top Contributor
weil wir immer main- Methoden zur Verfügung gestellt bekommen haben.
Java:
public static void main(String[] args) {
      
    }
Aus mehr besteht eine main-Methode auch nicht. Was diese Methode nun ausführt bleibt dem Programmierer überlassen ;)

Ich habe zwar versucht eine main-Methode zu erstellen war da nicht so erfolgreich. Da kam dann split trainTrain@4e2c390c raus
Da kommt "genau" das raus was du programmiert hast ;)

Java:
.....
        System.out.printf("split train", train.split(3)); // hier gibst du "split train" aus
.......
        System.out.println(train); // hier willst du das objekt ausgeben. Java weiß ja nicht wie du das Objekt ausgegeben haben willst und verwendet daher eine Standardimplementierung aus Klassenname@Speicheradresse
 

Hacer

Aktives Mitglied
Ich habe noch eine Frage bezüglich der split-Methode und zwar wie kann ich die n+1te Waggon in den Zug einfügen?
Java:
public Train split(int n){
      Coach pointer =firstCoach;
      for(int i =0; i<=n; i++){
            pointer=pointer.getNext();
      }
      Train neuerZug = new Train();
       neuerZug.append(pointer.getNext());//greife ich hier jetzt auf den Wert aus der For-schleife? und falls nicht geht es dann, wenn ich dies in die for-schleife einfüge und den neuen Zug ganz am Anfang erstelle?
       pointer.setNext(null);
       return neuerZug;
}
 
Zuletzt bearbeitet:

Jardcore

Top Contributor
Wo steht eigentlich etwas von split() :) In der Aufgabenstellung nicht, bzw du hast zwei Mal das gleiche gepostet.
Aber theoretisch musst du einfach sowas machen.
Java:
Coach brandNewCoach = new Coach(...);
lastCoach.setNext(brandNewCoach);
lastCoach = brandNewCoach;
Code:
//Ausgangslage
                       lastCouch
                          v
TRAIN => [  Coach 1 ]-[ Coach 2 ]

//Schritt 1
TRAIN => [  Coach 1 ]-[ Coach 2 ] - [ brandNewCoach ]

                                       lastCouch
//Schritt 2                               v
TRAIN => [  Coach 1 ]-[ Coach 2 ] - [ brandNewCoach ]
 

Jardcore

Top Contributor
Die Theorie wäre:
Du erstellst einen neuen Zug (Zug#2)
Du gehst die Waggons des aktuellen Zugs(Zug#1) durch und zählst dabei hoch.
Wenn nun nun bei dem Waggon angekommen bist, ab dem getrennt werden soll, setzt du diesen beim Zug#1 als deinen letzten Waggon.
Ab nun musst du alle weiteren Waggons zum Zug#2 hinzufügen.
Wenn du alle Waggons durchgegangen bist musst du noch den letzten Waggon abkoppelt XD
Also lastCouch.setNext(null); setzen.

Wenn man das einfach so runterschreibt sieht das wie folgt aus. Wahrscheinlich kann man das noch optimieren, aber das ist die genaue Umsetzung von der Theorie zur Praxis.
Java:
public Train split(int n) {
        Train train = new Train();
        int countOfCoaches = 1;
      
        Coach currentCoach = firstCoach;
        while(currentCoach != null) {
          
            if(countOfCoaches == n) {
                lastCoach = currentCoach;
              
            } else if(countOfCoaches > n) {
                train.append(currentCoach);
            }
            countOfCoaches++;
            currentCoach = currentCoach.getNext();
        }
      
        lastCoach.setNext(null);
      
        return train;
    }
 

Meniskusschaden

Top Contributor
Eigentlich müsste es doch auch genügen, nur einen Waggon umzukoppeln, denn dessen Folgewaggons können ja seine Folgewaggons bleiben. Ein paar Referenzen wie z.B. lastCoach muß man natürlich trotzdem in Ordnung bringen.
 

Flown

Administrator
Mitarbeiter
Also ich seh das wie @Meniskusschaden. Man muss nur mit Pointer jonglieren, denn die Struktur ändert sich ja nicht und man kann ja auf alle privaten Felder von Train zugreifen:
Java:
public class Train {
  private Coach firstCoach = null;
  private Coach lastCoach = null;
  
  public void append(Coach c) {
    if (firstCoach == null) {
      firstCoach = lastCoach = c;
    } else {
      lastCoach.setNext(c);
      lastCoach = c;
    }
  }
  
  public boolean checkAvailability(int[] passengers) {
    Coach c = firstCoach;
    for (int i = 0; i < passengers.length; i++) {
      if (c == null || c.getPassengers() < passengers[i]) {
        return false;
      }
      c = c.getNext();
    }
    return true;
  }
  
  public Train split(int n) {
    Train result = new Train();
    Coach current = null;
    Coach next = firstCoach;
    for (int i = 0; i < n && next != null; i++) {
      current = next;
      next = next.getNext();
    }
    result.firstCoach = next;
    result.lastCoach = lastCoach;
    if (current == null) {
      firstCoach = lastCoach = null;
    } else {
      lastCoach = current;
      current.setNext(null);
    }
    return result;
  }
  
  public void remove() {
    if (firstCoach == lastCoach) {
      firstCoach = lastCoach = null;
    } else {
      Coach c = firstCoach;
      while (c.getNext() != lastCoach) {
        c = c.getNext();
      }
      lastCoach = c;
    }
  }
  
  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append('[');
    for (Coach c = firstCoach; c != null; c = c.getNext()) {
      builder.append(c.getPassengers());
      if (c != lastCoach) {
        builder.append(", ");
      }
    }
    return builder.append(']').toString();
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
J Listen Operationen Java Basics - Anfänger-Themen 4
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3
S Warum muss ich die operationen mit AffineTransform in umgekehrter Reihenfolge ausfuehren..? Java Basics - Anfänger-Themen 4
B Matrizen Operationen Java Basics - Anfänger-Themen 7
S NaN - Operationen ohne Fehler? Java Basics - Anfänger-Themen 3
B AffineTransform - Reihenfolge der Operationen Java Basics - Anfänger-Themen 3
G Messen von Elementaren Operationen Java Basics - Anfänger-Themen 3
S Liste von möglichen Operationen Java Basics - Anfänger-Themen 2
B genaue Anzahl der Operationen in Schleifen Java Basics - Anfänger-Themen 5
C Operationen auf Bitebene und Verschiebeoperatoren wichtig? Java Basics - Anfänger-Themen 26
Haave Postfix-Rechner: mehrere math. Operationen nacheinander ausführen Java Basics - Anfänger-Themen 8
M Bit/Byte Operationen Java Java Basics - Anfänger-Themen 8
B math. Operationen + Ausgabe Fehler :S Java Basics - Anfänger-Themen 5
K println - Klammern von Operationen Java Basics - Anfänger-Themen 4
O Operationen auf ein Set Java Basics - Anfänger-Themen 3
Q mathematische Operationen als Methode und nicht Infix-Operator Java Basics - Anfänger-Themen 14
X Zählen von arithmetischen Operationen und Vergleichsoperationen Java Basics - Anfänger-Themen 7
R Kommandozeile Operationen Java Basics - Anfänger-Themen 3
G Strings Operationen Java Basics - Anfänger-Themen 7
G String-Operationen Java Basics - Anfänger-Themen 6
F Operationen mit Zeichenketten Java Basics - Anfänger-Themen 8
ven000m Aritmethische Operationen Java Basics - Anfänger-Themen 7
S Stack-Operationen Java Basics - Anfänger-Themen 59
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
N Erste Schritte HelloWorld möchte einfach nicht laufen Java Basics - Anfänger-Themen 11
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
V einfach verkettete Listen Java Basics - Anfänger-Themen 10
N Best Practice Doppelte und einfach Anführungsstriche in Runtime.getruntime().exec() Java Basics - Anfänger-Themen 6
O Exception behandlung einfach Ueben mit Fakt! Java Basics - Anfänger-Themen 10
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
Hanschyo Programm schließt sich einfach Java Basics - Anfänger-Themen 2
O Einfach verkettete Liste - Revert Methode Java Basics - Anfänger-Themen 1
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
S Einfach verkette Liste Java Basics - Anfänger-Themen 27
R Erste Schritte Verkettete Liste will einfach nicht in meinen Schädel Java Basics - Anfänger-Themen 11
C Methoden Einfach verkette Liste - int Werte aufsteigend sortieren Java Basics - Anfänger-Themen 1
V Codezeile wird einfach nicht ausgeführt Java Basics - Anfänger-Themen 23
M Quadrat zeichnen einfach bitte! Java Basics - Anfänger-Themen 2
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
K Einfach Verkettete Liste - addFirst() Java Basics - Anfänger-Themen 7
N Einfacher Rechner (für mich nicht so einfach) Java Basics - Anfänger-Themen 5
M Array in ein Array übertragen (möglichst einfach) Java Basics - Anfänger-Themen 6
T Input/Output Daten/Objekte einfach speichern Java Basics - Anfänger-Themen 5
R Methoden... ich vesteh sie einfach nicht Java Basics - Anfänger-Themen 15
llabusch Verkette Listen - Einfach und Doppelt Java Basics - Anfänger-Themen 3
X Einfach verkettete Liste, keine Fehlermeldung Programm friert ein Java Basics - Anfänger-Themen 4
C Erste Schritte Problem mit der Division von Koeffizienten... oder einfach nur irgendwlechen zahlen Java Basics - Anfänger-Themen 10
D Klassen Klassen, Objekte, Konstruktor - einfach erklärt Java Basics - Anfänger-Themen 12
B Variable wird einfach so wieder auf "null" gesetzt Java Basics - Anfänger-Themen 12
T Elemente im Vector werden einfach überschrieben! Java Basics - Anfänger-Themen 3
X Einfach Verkettete Liste Java Basics - Anfänger-Themen 16
S ich begreife es einfach nicht -> zweck der Schnittstellen Java Basics - Anfänger-Themen 27
J Interface Wie funktioniert das mit den Interfaces. Ich verstehe es einfach nicht! :( Java Basics - Anfänger-Themen 15
W Java-Programm als Icon mit Doppelklick einfach öffnen ? Java Basics - Anfänger-Themen 3
M Layout einfach bilden Java Basics - Anfänger-Themen 4
I Weiß einfach nicht mehr weiter... Java Basics - Anfänger-Themen 3
K Datentypen Einfach/Doppelt verkettete Liste Java Basics - Anfänger-Themen 4
N einfach verkettete liste fehler Java Basics - Anfänger-Themen 5
O Wie kann man das einfach lösen? (dynamisch viele Attribute) Java Basics - Anfänger-Themen 6
N einfach verkettete liste Java Basics - Anfänger-Themen 3
A If-Schleife spinnt - ganz einfach Code - Riesen Problem :) Java Basics - Anfänger-Themen 9
Luk10 einfach animation Java Basics - Anfänger-Themen 2
B OOP Einfach verkettete Liste - rekursive Methoden Java Basics - Anfänger-Themen 1
E JMC - Dlls einbinden - möglichst einfach Java Basics - Anfänger-Themen 8
S einfach verkettete Liste Java Basics - Anfänger-Themen 19
I einfach verkette Liste Java Basics - Anfänger-Themen 9
H Typumwandlung String --> Int (ganz einfach) Java Basics - Anfänger-Themen 9
O Observer - Einfach erklärt? Java Basics - Anfänger-Themen 5
T Einfach verkettete Liste: Wie Elemente löschen? Java Basics - Anfänger-Themen 4
K Ich verstehe switch einfach nicht Java Basics - Anfänger-Themen 4
M jar-Datei einfach umbenennen? Java Basics - Anfänger-Themen 8
D Einfach verkettete Liste Java Basics - Anfänger-Themen 20
S Filewriter schreibt einfach nicht Java Basics - Anfänger-Themen 6
G Opjektorientierte Programmierung (OOP). einfach für euch Java Basics - Anfänger-Themen 4
X WAV conversion ist einfach nicht möglich Java Basics - Anfänger-Themen 2
J jar erstellen. Es klappt einfach nicht Java Basics - Anfänger-Themen 14
L Eingeben Rechnen Ausgeben - Leider nicht so einfach Java Basics - Anfänger-Themen 31
P einfach frage zur vererbung Java Basics - Anfänger-Themen 9
G Frank A. - ports einfach öffnen und schließen Java Basics - Anfänger-Themen 3
M Caeser Verschlüsselung ganz einfach(nicht für mich) Java Basics - Anfänger-Themen 6
L while wird einfach übersprungen? Java Basics - Anfänger-Themen 4
D einfach berechnung einer onlinezeit Java Basics - Anfänger-Themen 25
B Thread will einfach nicht stoppen Java Basics - Anfänger-Themen 12
B Packages einfach kopieren? Java Basics - Anfänger-Themen 13
N Mein Applet findet -online- einfach die Klasse nicht ! Java Basics - Anfänger-Themen 6
S Java rundet einfach auf 0 Java Basics - Anfänger-Themen 2
C einfach verkettete Liste -> Elemente vertauschen Java Basics - Anfänger-Themen 2
L Ein Bild auf ein JFrame legen. nicht so einfach? =( Java Basics - Anfänger-Themen 11
M Tablelayout einbinden - ich schaff's einfach nicht Java Basics - Anfänger-Themen 16
D Button Text will einfach nicht erscheinen Java Basics - Anfänger-Themen 6
M Methoden. ich versteh das einfach nicht! Bitte helfen! Java Basics - Anfänger-Themen 4
H Kann man in Java einfach einen Beep erzeugen Java Basics - Anfänger-Themen 2
C einfach aber komisch Java Basics - Anfänger-Themen 5
R einfach verkettete Liste, intersect Java Basics - Anfänger-Themen 4
P Restart Button für einfach Applikation Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben