Weg-Suche-Problem rekursiv

Bitte aktiviere JavaScript!
Servus Community,
Nein leider ihr seid mich auch im neuen Jahr noch nicht ganz los^^
Ich habe ein Beispiel mit 1 rekursiven Methode, die alle indirekten Verbindungen ausprobieren soll. Wenn es eine gibt true zurück geben und wenn nicht false. Leider klappt dass bei mir nicht so ganz, hättet ihr eine Idee woran das liegen kann?

Hier mein Code:
Code:
package supply;
import java.util.*;

public class Firma
{
    private String name;
    private ArrayList<Firma> lieferanten;
    private double umsatz;
    private Firma lieferant;
    private ArrayList<Firma> verbindung;
    private boolean ergebnis;
   
    public Firma(String name)
    {
        this.name=name;
        this.lieferanten=new ArrayList<Firma>();
    }
   
    public String getName()
    {
        return name;
    }
   
    public boolean addLieferant(Firma lieferant, double umsatz)
    {
        if(!lieferanten.contains(lieferant))
        {
            lieferanten.add(lieferant);
            lieferant.umsatz=umsatz;
            return true;
        }
        return false;
    }
   
    public ArrayList<Firma> getLieferanten()
    {
        return lieferanten;
    }
   
    public double getUmsatzanteilVon(Firma lieferant)
    {
        double gesamtumsatz = 0;
        for (int i = 0; i<lieferanten.size(); i++)
        {
           gesamtumsatz += lieferanten.get(i).umsatz;
        }
       
        if(!lieferanten.contains(lieferant))
        {
            return 0;
        }
       
        else return (lieferant.umsatz/gesamtumsatz)*100;
    }
   
    public boolean hatLieferverbindungVon(Firma lieferant)
    {
        this.verbindung=new ArrayList<Firma>();
        this.ergebnis=false;
        return findeVerb(lieferant,this,verbindung);
    }
   
    public boolean findeVerb(Firma lieferant,Firma start,ArrayList<Firma> verbindung)
    {
        if(start == lieferant)
        {
            return true;
        }
       
        for(Firma fa:start.getLieferanten())
        {
            if(!verbindung.contains(fa))
            {
                verbindung.add(fa);
                return findeVerb(lieferant,fa,verbindung);
            }
        }
        return false;
    }
}
Normalerweise hätte ich ja ein Hashset statt einer ArrayList für die Lieferanten genommen, aber dann habe ich bei der rekursiven Methode noch weniger Plan.
Mit freundlichen Grüßen
El Hadji
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Java:
public boolean hatLieferverbindungVon(Firma lieferant) {
  return lieferanten
    .stream()
    .anyMatch(l -> l.equals(lieferant)
                || l.hatLieferverbindungVon(lieferant));
}
Außerdem:
Java:
@Override
public boolean equals(Object obj) {
  return name.equals(((Firma) obj).name);
}
@Override
public int hashCode() {
  return name.hashCode();
}
 
Ok vielen Dank, aber leider funktioniert das auch nicht bei allen Fällen -.-

Falsches Ergebnis (true) bei addLieferant FNR-5 zu Firma
FNR-5 wird beliefert von:
FNR-2
FNR-3 wird beliefert von:
FNR-1
FNR-4 wird beliefert von:
FNR-5
FNR-2
 
Was soll mir diese Ausgabe sagen? Welche Firmen hast du wie genau angelegt, welche Lieferanten haben sie und was genau versuchst du da, bzw. rufst du auf??
 
Nein leider ihr seid mich auch im neuen Jahr noch nicht ganz los^^
Puh, 2019 fängt ja schon gut an: Schneechaos im Süden, @El Hadji und andere Naturkatastrophen :rolleyes::p

Beim Rekursionsguru (@httpdigest) bist Du gut aufgehoben. Daher nur eine Randbemerkung: Deine Methode public boolean addLieferant(Firma lieferant, double umsatz) ist falsch implementiert; dort änderst Du den Umsatz des Lieferanten. Was passiert, wenn ein Lieferant zwei Firmen beliefert?
 
Puh, 2019 fängt ja schon gut an: Schneechaos im Süden, @El Hadji und andere Naturkatastrophen :rolleyes::p

Beim Rekursionsguru (@httpdigest) bist Du gut aufgehoben. Daher nur eine Randbemerkung: Deine Methode public boolean addLieferant(Firma lieferant, double umsatz) ist falsch implementiert; dort änderst Du den Umsatz des Lieferanten. Was passiert, wenn ein Lieferant zwei Firmen beliefert?
Ich steck direkt im Schneechaos, meine einzige Möglichkeit mit der Außenwelt Kontakt aufzunehmen ist über das Javaforum ;-)

Ok dachte ich mir schon, aber wenn ich eine Hashmap nehme. Kann ich ja in der rekursiven Methode keine Liste durchsuchen!
 
Code:
package supply;

import java.util.*;

public class Firma
{
    String name;
    HashMap <Firma, Double> liste = new HashMap<Firma, Double>();
     private ArrayList<Firma> lieferanten;
     /*
    private double umsatz;
    private Firma lieferant;
    private ArrayList<Firma> verbindung;
    private boolean ergebnis;
    */
  
    public Firma(String name)
    {
       this.name = name;
    }

  
    public String getName()
    {
       return name;
    }
   
    public boolean addLieferant(Firma lieferant, double umsatz)
    {
        if(lieferant.getName().equals(getName()))
        {
            return false;
        }
      
        if(liste.containsKey(lieferant))
        {
            return false;
        }
       
        else liste.put(lieferant, umsatz);
        return true;
    }
   
    public double getUmsatzanteilVon(Firma lieferant)
    {
        double gesamtumsatz = 0;
        Set<Firma> neu = liste.keySet();
       
        for(Firma f : neu)
        {
            gesamtumsatz += liste.get(f);
        }
      
      
        return ((liste.get(lieferant))/gesamtumsatz)*100;
     }
      
     /*
         public ArrayList<Firma> getLieferanten()
    {
        return lieferanten;
    }
    */
   @Override
public boolean equals(Object obj) {
  return name.equals(((Firma) obj).name);
}
@Override
public int hashCode() {
  return name.hashCode();
}
       
    public boolean hatLieferverbindungVon(Firma lieferant)
    {
        Set<Firma> lieferanten = liste.keySet();
        if(lieferant.getName().equals(this.getName()))
        {
            return false;
        }
  return lieferanten
   .stream()
    .anyMatch(l -> l.equals(lieferant)
                || l.hatLieferverbindungVon(lieferant));
}
    /*
    public boolean findeVerb(Firma lieferant,Firma start,ArrayList<Firma> verbindung)
    {
        if(start == lieferant)
        {
            return true;
        }
       
        for(Firma fa:start.getLieferanten())
        {
            if(!verbindung.contains(fa))
            {
                verbindung.add(fa);
                return findeVerb(lieferant,fa,verbindung);
            }
        }
        return false;
    }
    */

So aber leider wirft das Testprogramm jetzt folgende Fehlermeldung:
Error in Test:
java.lang.StackOverflowError: java.util.stream.MatchOps$1MatchSink.<init>(MatchOps.java:84)
   
}
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben