Methoden Beste Bestellung

El Hadji

Bekanntes Mitglied
Servus Community,
Ich hätte wieder eine Frage bezüglich meiner Methode. Angabe ist als Bild hinzugefügt.
Mein Problem ist dass das zurückgebende Array die Reihenfolge der sortierten Array besitzt und nicht die originale. Sprich mein Araay gibt {6,5,9,0}, statt {9,5,6,0} zurück. Könnt ihr meinen Code bitte verbessern oder mir sagen was ich machen kann. Hier die Aufgabe:
dxx4byfyr4y239vhr.png

und hier mein Code:
Code:
import java.util.*;

public class Bestellung
{
 
    public Bestellung()
    {
      
    }

    public int[] bestelle(int menge, double[] preis, int[]lieferbar)
    {
       ArrayList <Integer> lieferschein = new ArrayList<Integer>();
       int nochBenoetigt = menge;
       int gesamtMenge = 0;
     
        for (int i =0; i < lieferbar.length;i++)
        {
            gesamtMenge += lieferbar[i];
        }
      
        if (gesamtMenge < menge)
        {
            return null;
        }
     
        for(int i = 0; i < preis.length-1; i++)
        {
            for (int j =1; j < preis.length; j++)
            {
                if(preis[j-1] >= preis[j])
                {
                    Double sort = preis [j];
                    preis [j] = preis[j-1];
                    preis[j-1] = sort;
                  
                    Integer speicher = lieferbar [j];
                    lieferbar [j] = lieferbar[j-1];
                    lieferbar[j-1] = speicher;
                }
               
     
            }
        }
      
   
      
        for (int i =0; i < preis.length; i++)
        {
            if(lieferbar[i] <= nochBenoetigt)
            {
                lieferschein.add(lieferbar[i]);
                nochBenoetigt -= lieferbar[i];
            }
          
            else if(lieferbar[i] > nochBenoetigt)
            {
                lieferschein.add(nochBenoetigt);
                nochBenoetigt = 0;
            }
          
        }
      
        int [] fertig = new int [lieferschein.size()];
        Iterator <Integer> it = lieferschein.iterator();
        for(int i =0; it.hasNext(); i++)
        {
            fertig[i] = it.next();
        }
        return fertig;
    }
}
 

mihe7

Top Contributor
Aktuell sortierst Du das Array selbst. So wird aus {12.50, 11.50, 9.00, 15.00} natürlich {9.00, 11.50, 12.50, 15.00}.

Tatsächlich brauchst Du aber nur die Indizes in nach aufsteigendem Preis sortierter Reihenfolge zu wissen.

Zu Deinem Array {12.50, 11.50, 9.00, 15.00} kannst Du ein Index-Array {0,1,2,3} angeben. Dieses sortierst Du nach aufsteigenden Preisen und erhältst: {2,1,0,3}.

Thema erledigt :)
 

El Hadji

Bekanntes Mitglied
Stimmt, guter Ansatz.
Aber danach habe ich null Plan wie ich die richtigen Bestellmengen herausfinde.
Eine Idee wäre von mir die Bestellmengen Array (in falscher Reihenfolge ) {6,5,9,0} mit der Index Array {2,1,0,3} zu tauschen. Aber mir fällt kein Code dazu ein -.-
 

mihe7

Top Contributor
Du braucht nichts mehr zu tauschen. Die Indizes sind doch identisch.

Mal konkret:
Code:
double[] preise = {12.5, 11.5, 9, 15};
int[] lieferbar = {9,5,6,0};
int[] sortierung = {2, 1, 0, 3};

Preise und Lieferdaten in nach Preis aufsteigender Reihenfolge:
Code:
preise[sortierung[0]], lieferbar[sortierung[0]]
preise[sortierung[1]], lieferbar[sortierung[1]]
preise[sortierung[2]], lieferbar[sortierung[2]]
preise[sortierung[3]], lieferbar[sortierung[3]]

Alles klar?

Nachtrag: das gilt natürlich auch für die Bestellmengen: bestellung[sortierung[0]] entspricht der Bestellmenge des Artikels mit dem niedrigsten Preis.
 
Zuletzt bearbeitet:

El Hadji

Bekanntes Mitglied
Sorry ich steh total am Schlauch.
die array lieferbar ist zu beginn ja noch {20,5,6,100} und nicht die tatsächlichen mengen die ich bestelle. Deswegen muss ich ja die Array selbst sortieren um die richtigen Mengen zu bekommen
Code:
for (int i =0; i < preis.length; i++)
        {
            if(lieferbar[i] <= nochBenoetigt)
            {
                lieferschein.add(lieferbar[i]);
                nochBenoetigt -= lieferbar[i];
            }
           
            else if(lieferbar[i] > nochBenoetigt)
            {
                lieferschein.add(nochBenoetigt);
                nochBenoetigt = 0;
            }
           
        }
 

mihe7

Top Contributor
Gut, dann mal die Lösung:
Java:
import java.util.Arrays;

public class Test {
    private int[] sortiereIndizes(double[] werte) {
        int[] ergebnis = new int[werte.length];
        for (int i = 0; i < werte.length; i++) {
            ergebnis[i] = i;
        }

        for (int i = 0; i < werte.length - 1; i++) {
            for (int j = i+1; j < werte.length; j++) {
                int iIndex = ergebnis[i];
                int jIndex = ergebnis[j];
                if (werte[iIndex] > werte[jIndex]) {
                    ergebnis[i] = jIndex;
                    ergebnis[j] = iIndex;
                }
            }
        }

        return ergebnis;
    }

    private boolean genugLieferbar(int menge, int[] lieferbar) {
        int i = 0;
        while (menge >= 0 && i < lieferbar.length) {
            menge -= lieferbar[i++];
        }
        return menge <= 0;
    }

    public int[] bestelle(int menge, double[] preis, int[] lieferbar) {
        if (!genugLieferbar(menge, lieferbar)) {
            return null;
        }

        int[] sortierung = sortiereIndizes(preis);
        int[] bestellung = new int[sortierung.length];
        int i = 0;
        while (i < sortierung.length && menge > 0) {
            int index = sortierung[i++];
            bestellung[index] = Math.min(lieferbar[index], menge);
            menge -= bestellung[index];
        }
        return bestellung;
    }

    public static void main(String[] args) {
        Test test = new Test();
        double[] preis = {12.5, 11.5, 9.0, 15.0};
        int[] lieferbar = {20, 5, 6, 100};
        int[] bestellung = test.bestelle(20, preis, lieferbar);


        System.out.println("Preise: " + Arrays.toString(preis));
        System.out.println("mögliche Liefermengen: " +
                Arrays.toString(lieferbar));
        System.out.println("Bestellung: " + Arrays.toString(bestellung));
    }
}
 

El Hadji

Bekanntes Mitglied
Wow vielen Dank, ja mit mehreren Methoden klappts einfacher. Aber leider ist das nicht möglich ich muss es in einer Methode schreiben
 

mihe7

Top Contributor
Also, erstens steht das nicht in der Aufgabe, dass Du alles in einer Methode haben musst und zweitens dienen hier die Methoden einfach nur der Übersichtlichkeit. Wirklich gebraucht werden sie nicht.

Wenn ich mich nicht verschrieben habe:
Java:
    public int[] bestelle(int menge, double[] preis, int[] lieferbar) {
        int tmp = menge;
        for (int lb : lieferbar) {
            tmp -= lb;
        }
        if (tmp > 0) {
            return null;
        }

        int[] sortierung = new int[preis.length];
        for (int i = 0; i < preis.length; i++) {
            sortierung[i] = i;
        }
        for (int i = 0; i < preis.length - 1; i++) {
            for (int j = i+1; j < preis.length; j++) {
                int iIndex = sortierung[i];
                int jIndex = sortierung[j];
                if (preis[iIndex] > preis[jIndex]) {
                    int tmpIndex = iIndex;
                    sortierung[i] = jIndex;
                    sortierung[j] = tmpIndex;
                }
            }
        }

        int[] bestellung = new int[sortierung.length];
        int i = 0;
        while (i < sortierung.length && menge > 0) {
            int index = sortierung[i++];
            bestellung[index] = Math.min(lieferbar[index], menge);
            menge -= bestellung[index];
        }
        return bestellung;
    }
 

El Hadji

Bekanntes Mitglied
Er verlangt es so, Wow danke. Ich hab mich auch nochmal ranprobiert. Und meines ist anders, aber es kommt das gleiche Ergebniss raus. Ihr werdet sicher nur die Augen verdrehen bei meinem Programmierstil:
Code:
import java.util.*;

public class Bestellung2
{
 
    public Bestellung2()
    {
       
    }

    public int[] bestelle(int menge, double[] preis, int[]lieferbar)
    {
       ArrayList <Integer> lieferschein = new ArrayList<Integer>();
       ArrayList <Integer> lieferscheinSortiert = new ArrayList<Integer>();
       int nochBenoetigt = menge;
       int gesamtMenge = 0;
       int [] index = new int [lieferbar.length];
      
      
        for (int i =0; i < lieferbar.length;i++)
        {
            gesamtMenge += lieferbar[i];
        }
       
        if (gesamtMenge < menge)
        {
            return null;
        }
       
        for (int i = 0; i < index.length; i++)
        {
            index[i] = i;
        }
       
       
   for(int i = 0; i < preis.length-1; i++)
        {
            for (int j =1; j < preis.length; j++)
            {
                if(preis[j-1] >= preis[j])
                {
                    Double sort = preis [j];
                    preis [j] = preis[j-1];
                    preis[j-1] = sort;
                   
                    Integer speicher = lieferbar [j];
                    lieferbar [j] = lieferbar[j-1];
                    lieferbar[j-1] = speicher;
                   
                    Integer zwischen = index [j];
                    index [j] = index[j-1];
                    index[j-1] = zwischen;
                }
                
      
            }
        }
      
        for (int i =0; i < preis.length; i++)
        {
            if(lieferbar[i] <= nochBenoetigt)
            {
                lieferschein.add(lieferbar[i]);
                nochBenoetigt -= lieferbar[i];
            }
           
            else if(lieferbar[i] > nochBenoetigt)
            {
                lieferschein.add(nochBenoetigt);
                nochBenoetigt = 0;
            }
           
        }
       
       
      for (int i = 0; i < index.length; i++)
      {
          lieferscheinSortiert.add(0);
        }
       
      for (int i = 0; i < index.length; i++)
      {
          lieferscheinSortiert.set(index[i], lieferschein.get(i));
        }
         int [] fertig = new int [lieferscheinSortiert.size()];
        Iterator <Integer> it = lieferscheinSortiert.iterator();
        for(int i =0; it.hasNext(); i++)
        {
            fertig[i] = it.next();
        }
      return fertig;
}
}
 

mihe7

Top Contributor
Deine "Gesamtmenge" gefällt mir besser. Beim Rest gäbe es allerdings Punktabzug, da ist ja alles doppelt gemoppelt.
 

mihe7

Top Contributor
Jo leider aber ich kapier das Beispiel nicht anders^^
Das solltest Du aber.

Aja gibts eine schnellere Methode die ArrayList vorher zu befüllen oder muss ich das mit der Schleife machen?
Es geht um lieferscheinSortiert, oder? Was willst Du denn mit damit?

Du fügst erstmal n-mal 0 zur Liste hinzu: 0, 0, 0, 0
Dann iterierst Du i von 0 bis n-1 und sagst jeweils: ersetze das Element an Stelle index[i] durch lieferschein.get(i).
Am Schluss iterierst Du über die Liste und kopierst den Spaß in ein Array.

Genau das geht doch wesentlich einfacher mit einem Array:
Java:
int[] fertig = new int[index.length];
for (int i = 0; i < index.length; i++) {
    fertig[index[i]] = lieferschein.get(i);
}
 

El Hadji

Bekanntes Mitglied
Genau das geht doch wesentlich einfacher mit einem Array:
Java:
int[] fertig = new int[index.length];
for (int i = 0; i < index.length; i++) {
    fertig[index[i]] = lieferschein.get(i);
}
[/QUOTE]

Mille Grazie, das hätte mir wirklich selber einfallen müssen^^
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Aktuell beste Methode um zwei Bilder zu vergleichen..? Java Basics - Anfänger-Themen 1
F Beste Datenstruktur zum Speichern? Java Basics - Anfänger-Themen 1
S mehrfache if-Abfragen - beste Lösung Java Basics - Anfänger-Themen 1
D Datentypen Welcher ist der beste Datentyp? Java Basics - Anfänger-Themen 28
4 Was ist der beste Lehrberuf um Programmieren (vor allem JAVA und APP) zu fernen Java Basics - Anfänger-Themen 5
N Beste Datendarstellung? Java Basics - Anfänger-Themen 3
manunana89 Bilder auf JFrame/beste Möglichkeit??? Java Basics - Anfänger-Themen 5
F Ewiges Leid mit "protected" (oder "wie der beste Freund eine hinrücks betrügt") Java Basics - Anfänger-Themen 26
Q Beste Komponenten für 3-Schichten-Architektur gesucht Java Basics - Anfänger-Themen 7
M Beste Art Bilder zu kopieren? Java Basics - Anfänger-Themen 4
X Beste Entwicklungsumgebung. Java Basics - Anfänger-Themen 10
R beste linux IDE? Java Basics - Anfänger-Themen 4
A Struktur -> Beste Lösung? Java Basics - Anfänger-Themen 3
M Bestellung Ausgeben bis Bestellung zuende Java Basics - Anfänger-Themen 3
L Erste Schritte Programm Bestellung/Rechnung addieren Java Basics - Anfänger-Themen 3
C Button - neues Fenster - Bestellung anzeigen Java Basics - Anfänger-Themen 10
D The constructor Bestellung(Bestellung.Produkt, Bestellung.Kunde) is undefined Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben