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;
    }
}
 
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 🙂
 
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 -.-
 
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:
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;
            }
           
        }
 
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));
    }
}
 
Wow vielen Dank, ja mit mehreren Methoden klappts einfacher. Aber leider ist das nicht möglich ich muss es in einer Methode schreiben
 
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;
    }
 
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;
}
}
 
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);
}
 
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^^
 

Neue Themen


Zurück
Oben