# minimum eines Arrays?



## Obesjana (18. Nov 2017)

Da ich keine Vorkenntnisse habe und ich jetzt wirklich 1 Tag dran sitze, versuche ich mir Hilfe zu holen. Ich hab noch so ein bisschen das Problem mit der Syntax, mir fällt es schwer zu verstehen von wo, ich was nehmen kann usw.
Also folgendes Problem:
Ich soll das Minimum der Produkte ermitteln, die im Warenkorb sind.

Quellcode vom "Warenkorb":

```
public class Basket {
    private String username;
    private Product[] products;

    public Basket(String username) {
        this.username = username;
        this.products = new Product[0];
    }

    public void addProduct(Product product) {
        Product[] newProdcuts = new Product[products.length + 1];

        for (int i = 0; i < products.length; i++) {
            newProdcuts[i] = products[i];
        }

        newProdcuts[newProdcuts.length - 1] = product;

        products = newProdcuts;
    }

    public void print() {
        System.out.format("Warenkorb für %s", username);

        if (products.length == 0) {
            System.out.println(" ist leer.");

            return;
        } else {
            System.out.println(":");
        }

        Price sum = new Price(0);
        Product product;
        for (int i = 0; i < products.length; i++) {
            product = products[i];

            System.out.format("%s\t%s%n", product.getName(), product.getPrice().getFormatted());

            sum = sum.add(product.getPrice());
        }

        System.out.format("Gesamtwert: %s%n", sum.getFormatted());
    }
```

Quellcode vom "Produkt":

```
public class Product {

    /**
     * Die Bezeichnung dieses Produktes.
     */
    private final String name;

    /**
     * Der Preis dieses Produktes.
     */
    private final Price price;

    /**
     * Erzeugt ein neues Produkt mit dem gegebenen Namen und dem
     * gegebenen Preis in Cent.
     *
     * Sollte der gegebene Name den Wert {@code null}
     * haben oder leer sein, so wird der Name des erzeugten Produktes
     * auf {@code unbekannt} gesetzt.
     *
     * Sollte der gegebene Preis kleiner als 10 sein, so wird der Preis
     * des erzeugten Produktes auf 10 Cent gesetzt.
     *
     * @param pName Der Name fÃ¼r das zu erzeugende Produkt.
     * @param pPrice Der Preis fÃ¼r das zu erzeugende Produkt in Cent.
     */
    public Product(final String pName, final int pPrice) {
        if (pName == null) {
            name = "unbekannt";
        } else if (pName.isEmpty()) {
            name = "unbekannt";
        } else {
            name = pName;
        }
        if (pPrice > 10){
        price = new Price(pPrice);
    }     else {
        price = new Price(10);
    }
    }

    /**
     * Gibt den Namen dieses Produktes zurÃ¼ck.
     *
     * @return Den Namen dieses Produktes.
     */
    public String getName() {
        return name;
    }

    /**
     * Gibt den Preis dieses Produktes zurÃ¼ck.
     *
     * @return Den Preis dieses Produktes.
     */
    public Price getPrice() {
        return price;
    }

    /**
     * Gibt die Informationen zu diesem Produkt auf der Konsole aus.
     * Dabei wird zunÃ¤chst der Name und dann der Preis gefolgt von
     * einer Zeilenschaltung ausgegeben. (Nocht nicht fertig).
     */
    public void print() {
    }
 
}
```

Quellcode vom "Preis":

```
public class Price {
    private int cents;

    /**
     * Price Konstruktor.
     *
     * @param int cents Wert in Cent. Darf auch negative Werte annehmen.
     */
    public Price(int cents) {
        this.cents = cents;
    }

    /**
     * Gibt den Wert dieses Preises in Euro auf der Konsole aus.
     *
     * FÃ¼r einen Wert von 100 Cent gibt diese Funktion "1,0 Euro" aus.
     */
    public void print() {
        System.out.println(this.getFormatted());
    }

    /**
     * Gibt einen String zurÃ¼ck, der den Preis in lesbarer Form
     * wiederspiegelt.
     *
     * @return Den Preis in lesbarer Form.
     */
    public String getFormatted() {
        int euro = cents / 100;
        int cent = Math.abs(cents % 100);

        return String.format("%d,%d Euro", euro, cent);
    }

    /**
     * Addiert den Wert des Price-Objekts mit dem Wert dieses
     * Price-Objekts und gibt ein neues Price-Objekt mit der Summe
     * zurÃ¼ck.
     *
     * @param Price price Das Price-Objekt, dessen Wert als Summand dient.
     *
     * @return Ein neues Price-Objekt, welches den Wert der Summe hat.
     */
    public Price add(Price price) {
        return new Price(price.cents + this.cents);
    }

    /**
     * Addiert das Attribut "cents" mit dem Wert dieses Price-Objekts und
     * gibt ein neues Price-Objekt mit dem Wert der Summe zurÃ¼ck.
     *
     * @param int cents Die Anzahl an Cents, die als Summand dienen.
     *
     * @return Ein neues Price-Objekt, welches den Wert der Summe hat.
     */
    public Price add(int cents) {
        return new Price(this.cents + cents);
    }

    /**
     * Gibt den Wert dieses Price-Objektes in Cent zurÃ¼ck.
     *
     * @return Den Wert dieses Price-Objektes in Cent.
     */
    public int getCent() {
        return cents;
    }
}
```
Ich soll also eine neue private Hilfsmethode erstellen, wo ich das billigste Produkt ermittle.

Es ist natürlich Hausaufgabe, aber ich komme bei diesem Schritt nicht weiter, und bräuchte einen Ansatz oder ähnliches. Würde mich echt freuen wenn ich so etwas bekommen könnte^^.


----------



## Javinner (18. Nov 2017)

> Ich soll also eine neue private Hilfsmethode erstellen, wo ich das billigste Produkt ermittle


im `private Product[] products;`
nach kleinstem Preis suchen, benutze Methode

```
public Price getPrice() {
   return price;
}
```
mittels einer For-Schleife


----------



## Obesjana (18. Nov 2017)

Danke für den Ansatz, versuche es irgendwie hinzubekommen .


----------



## Javinner (18. Nov 2017)

Sorry, war eine schöne Aufgabe, ich konnte es mir nicht verkneifen.
Methode print() habe ich ebenso angepasst.

```
Product productA = new Product("Butter", 129);
Product productB = new Product("Milch", 79);
Product productC = new Product("Kaffee", 479);
Product productD = new Product("Zucker", 179);
Product productE = new Product("Apfel", 59);
Product productF = new Product("Tee", 169);
      
Basket basket = new Basket("Obesjana");
basket.addProduct(productA);
basket.addProduct(productB);
basket.addProduct(productC);
basket.addProduct(productD);
basket.addProduct(productE);
basket.addProduct(productF);
basket.print();
basket.getSmallestPrice().print();

/** Konsolenausgabe */
Warenkorb für Obesjana:
Butter    1,29 Euro
Milch    0,79 Euro
Kaffee    4,79 Euro
Zucker    1,79 Euro
Apfel    0,59 Euro
Tee    1,69 Euro
Gesamtwert: 10,94 Euro
[Name: Apfel][Preis: 0,59 Euro]
```


----------



## Obesjana (18. Nov 2017)

Wow . Ich komme aber leider nicht weiter bei der Methode getPrice. Also ich muss ja den Array von products absuchen, aber ich verstehe nicht genau wie ich das getPrice da reinbringen soll. 
Die Syntax macht mich zu schaffen .


----------



## Javinner (18. Nov 2017)

Obesjana hat gesagt.:


> Wow . Ich komme aber leider nicht weiter bei der Methode getPrice. Also ich muss ja den Array von products absuchen, aber ich verstehe nicht genau wie ich das getPrice da reinbringen soll.
> Die Syntax macht mich zu schaffen .


Was hast du bisher?


----------



## Flown (18. Nov 2017)

Beschreibe es mal in Prosaform wie du es im echten Leben machen würdest, wenn du Produkte mit Preisen in einem Warenkorb hättest.


----------



## Obesjana (18. Nov 2017)

Naja, also wenn mir jemand sagt ich soll im Warenkorb das Produkt aussuchen, was am billigsten ist, dann würde ich jedes Produkt nehmen und den Preis erstmal angucken. Jeden Preis vergleichen und das billigste halt aufschreiben.
Ich kann mir halt eine for schleife mit einer if Anweisung vorstellen.


----------



## Obesjana (18. Nov 2017)

Ich hab halt rumprobiert aber z.b. wenn ich product.getPrice() nehme, steht dass "product" nicht deklariert wurde. Ich bin irgendwie verloren.


----------



## Javinner (18. Nov 2017)

Schau dir das hier an und versuche es nachzuvollziehen.

```
public class Test
{

    public static void main(String[] args)
    {
        int[] number = {6, 1, 23, 43, 645, 2, 33};
        System.out.println(getSmallestNumber(number));
    }

    static int getSmallestNumber(int[] array)
    {
        int smallestNumber = array[0];
        for (int i = 0; i < array.length; i++) {
            if (array[i] < smallestNumber) {
                smallestNumber = array[i];
            }
        }
        return smallestNumber;
    }

}
/** Konsolenausgabe */
1
```


----------



## Javinner (18. Nov 2017)

Obesjana hat gesagt.:
			
		

> Da ich keine Vorkenntnisse habe und ich jetzt wirklich 1 Tag dran sitze


So garnicht oder nicht in Java?


----------



## Obesjana (18. Nov 2017)

vor ab, in der Aufgabe steht auch, das die Methode keine Argumente erwartet, ich glaube das wäre noch wichtig zu erwähnen 
Ok.
Also wir haben einen Array (number) deklariert und initialisieren ihn mit bestimmten Ziffern (6,1,23...). Dann eine Methode die eben die kleinste Ziffer ermittelt. Dabei eine Variable (smallestNumber) initialisiert array[0]. eine for schleife wo die länge überprüft wird und bei jedem gang um 1 erhöht wird. in der for-schleife eine if anweisung die besagt, wenn array_ kleiner als die Variable smallestNumber ist, die Variable eine neue Zuweisung bekommt (in dem Fall array. Am ende soll die Mehtode die Variable eben zurückgeben.
Müsste der Array nicht "number" heißen?
Jedenfalls verstehe ich schon den Ablauf, er soll in jedem Index überprüfen, ob dieser Index kleiner als die Variable ist, aber ich verstehe die variable nicht irgendwie. Warum array[0] ?_


----------



## Obesjana (18. Nov 2017)

Javinner hat gesagt.:


> So garnicht oder nicht in Java?


Also ich habe php vorher gemacht, aber in Java sehe ich nur Fragezeichen, zumindest was die ganze Syntax mit "public, private, String, int" oder Methoden aufrufe eben angeht.


----------



## Javinner (18. Nov 2017)

@Obesjana
Na das sieht doch schon nicht schlecht aus.


> _Warum array[0] _


Var smallestNumber muss initialisiert werden.
So bekommt diese die erste Ziffer des Arrays und, wenn den der Fall eintreten sollte, dass eine Zahl noch kleiner ist, als eben die erste Zahl im Array, ergo Var smallestNumber
, wird dieser Wert in der Var smallestNumber festgehalten.


> _Müsste der Array nicht "number" heißen?_


Im Methodenkopf?! Nein, da kann stehen, was auch immer du willst, ich benenne es jedoch immer nach dem Objekt, welches übergeben wird.


> vor ab, in der Aufgabe steht auch, das die Methode keine Argumente erwartet


Habe ich gesehen, hier sollte es nur der Vorführung dienen.

Versuche nun das Prinzip auf dein Programm zu übertragen. Tipp: ich habe die Methode getSmallestNumber
in der Klasse Basket realisiert, so kann die Methode auf Array produkts intern greifen, ohne diesen als Parameter übergeben zu bekommen

edit: Methode getSmallestPrice war natürlich gemeint, sorry bin ziemlich platt.


----------



## Obesjana (18. Nov 2017)

Kein Problem .
Ich bin dabei dass umzusetzen.


----------



## Obesjana (18. Nov 2017)

```
public Basket determineCheapestProduct(){
        Product productz = products[0];
        for (int i = 0; i < products.length; i++) {
            if (products[i] < productz){
                productz = products[i];
               
            }
           
        }
        return productz;
```
Warum kriege ich da einen Fehler in der if Anweisung?
Oh man, tut mir leid, ich komm mir komplett blöd vor.
edit: mir fällt auf, das meine methode falsch beschrieben ist. muss da nicht basket hin?
edit2: code verändert, trotzdem gleiche frage x).


----------



## JCODA (18. Nov 2017)

Du kannst Produkte nicht vergleichen, aber du kannst jeweils getPrice() aufrufen, um deren Preise zu vergleichen.


----------



## Obesjana (18. Nov 2017)

JCODA hat gesagt.:


> Du kannst Produkte nicht vergleichen, aber du kannst jeweils getPrice() aufrufen, um deren Preise zu vergleichen.


Ok, also mit product.getPrice(), aber wie mach ich das denn jetzt genau?


----------



## Javinner (18. Nov 2017)

@Obesjana
Schau dir das hier an:

```
Product productA = new Product("Butter", 129);
      
int a = productA.getPrice().getCent();
String preis = productA.getPrice().getFormatted();
      
System.out.println("Integer a: " + a);
System.out.println("String preis: ".concat(preis));

/** Konsolenausgabe */
Integer a: 129
String preis: 1,29 Euro
```
Weißt du, worauf ich hinaus will?
Schau dir dein Code ganz genau an.


----------



## Obesjana (18. Nov 2017)

Javinner hat gesagt.:


> Weißt du, worauf ich hinaus will?
> Schau dir dein Code ganz genau an.


Sowohl Int als auch String geben das gleiche hinaus, aber sind unterschiedlich?
Mein Kopf ist mittlerweile matsch, ich komme einfach nicht darauf.


----------



## Javinner (18. Nov 2017)

Nun weißt du, wie man an ein Integer-Wert eines Produktes herankommt.
Du weißt auch jetzt, wie man den kleinsten Wert eines Arrays ermittelt.
Jetzt?


----------



## Obesjana (18. Nov 2017)

Javinner hat gesagt.:


> Product productA = *new* Product("Butter", 129);


Du hast ja aber in deinem Fall ein Produkt vor definiert(produktA). Was ist wenn ich gar nicht weiß wie viel Produkte der Benutzer in den Warenkorb gelegt hat?


----------



## Javinner (18. Nov 2017)

Das war ja auch nur, um dir zu zeigen, wie man bei einem Produkt an den Wert eines Integer herankommt. Nun nimm doch den Wert, bau es in die Schleife ein und ermittele so den kleinsten Preis deines Warenkorbes.


----------



## Javinner (18. Nov 2017)

Methode getSmallestPrice() Rueckgabewert: Produkt

        a) Var. produktImArray 
        b) Var. smallestPrice (soll den groesstmoeglichen Wert fuer den Varaiblentyp erhalten)
        c) Suche im Array "produkts" nach kleinstem Integerwert und speichere diesen.
        d) liefere das Produkt mit dem kleinsten Preis zurueck.
           return array[produktImArray];


----------



## Obesjana (18. Nov 2017)

```
public Product determineCheapestProduct(){
        Product productz = products[0];
        int m = 1000000;
        for (int i = 0; i < products.length; i++) {
            if (productz.getPrice().getCent() < m){
                productz = products[i];
               
            }
           
        }
        return productz;
```
Ist mein letzter Standpunkt. Ich leg mich ins Bett.


----------



## Javinner (18. Nov 2017)

Schau dir das mal an:

```
public Product getSmallestPrice()
{
        int produktImArray = 0;
        int smallestPrice = Integer.MAX_VALUE;
        for (int i = 0; i < this.products.length; i++) {
            if (products[i].getPrice().getCent() < smallestPrice) {
                smallestPrice = products[i].getPrice().getCent();
                produktImArray = i;
            }
        }
        return products[produktImArray];
}
```


----------



## Obesjana (23. Nov 2017)

Nachtrag: @Javinner, es tut mir leid, ich hab vollkommen vergessen mich zu bedanken. Hat mir sehr geholfen, auch bei den nächsten Übungen.
Der Code hat super funktioniert, danke nochmal. Durch das verstehen dieser Aufgabe, konnte ich die folgenden Aufgaben problemlos lösen!


----------



## Javinner (23. Nov 2017)

@Obesjana 
Kein Thema, freut mich, dass es so gut geklappt hat.


----------

