# 2 return werte für Greedy-Algorithmus (gelöst)



## chik (19. Mai 2009)

Hallo zusammen,

habe eine eventuell simple Frage (hoffe sie ist nicht all zu dumm).
Wie kann ich zwei return Werte ausgeben?

Habe hier einen Greedy-Algorhitmus.
Ein Rucksack muss mit 24 Einheiten gefüllt werden, der computer soll immer das lokale Beste finden.

Funktioniert auch alles soweit, nur brauche ich noch den runner.item statt nur den Value, damit ich bzw. der Tutor auch weiß, welche Packete verwendet wurden.

By the way, weiß jemand, wieso der searchBig scheinbar immer doppelt durchläuft?
Ist nicht schlimm aber sinnlos iwie und wenns der Tutor merkt, zieht er Punkte ab.

(für den (nur) relevanten Bereich nach unten scrollen)


```
/**
 * Write a description of class L here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class LinkedListElemente { 
private Object item;
private Object size;
private int value;
private LinkedListElemente next; 
public LinkedListElemente() { } 

private LinkedListElemente(Object i, LinkedListElemente n) { 
    item = i; 
    next = n; 
}

public static void main(String[] args){
LinkedListElemente Alle = new LinkedListElemente();
LinkedListElemente RuckSack = new LinkedListElemente();
Alle.insertlast("A",3,4);
Alle.insertlast("B",4,5);
Alle.insertlast("C",7,10);
Alle.insertlast("D",8,11);
Alle.insertlast("E",9,13);
System.out.println("Kontrollausgabe nach dem Anlegen");
Alle.ausgeben();

int maxGroeße = 0;
}

public void test(){
LinkedListElemente Alle = new LinkedListElemente();
LinkedListElemente RuckSack = new LinkedListElemente();
Alle.insertlast("A",3,4);
Alle.insertlast("B",4,5);
Alle.insertlast("C",7,10);
Alle.insertlast("D",8,11);
Alle.insertlast("E",9,13);
System.out.println("Kontrollausgabe nach dem Anlegen");
System.out.println("Verfügbar");
Alle.ausgeben();
System.out.println("Rucksack");
RuckSack.ausgeben();
int actGroeße = 0;
System.out.println("Anfangswert Rucksackkapazität " + actGroeße);
while (actGroeße <24){
if (Alle.searchBig(actGroeße) == 25){break;};
actGroeße=actGroeße+Alle.searchBig(actGroeße);
System.out.println("Zwischen Größe " + actGroeße);
}
System.out.println("Ergebnis " + actGroeße);
}

// suche das groeßte Element
public int searchBig(int i){
int temp = 24-i;
LinkedListElemente runner = this;
if (runner.value >= temp) {System.out.println("Fertig"); return 25;};
//System.out.println("Anfangswert runner" + runner.value);
while (runner.next.value<=temp && runner.next.value!= 0)
{runner=runner.next;};
//System.out.println("Endwert runner" + runner.value);
return runner.value;
}
 
public void insertlast(Object gegenstand, Object groeße, int wert) { 
    if (item == null) { 
        item = gegenstand;
        size = groeße;
        value = wert;
        next = new LinkedListElemente(); 
    } else 
    next.insertlast(gegenstand, groeße, wert); 
}
 

public void ausgeben(){
    System.out.println("==============" + "Ausgabe" + "==============");
    LinkedListElemente runner = this;
    //Kein Element Fall
    if (runner == null) {return;};
    //Nur 1 Element Fall
    if (runner.next == null) {
        System.out.println(runner.item + "," + runner.size + "," +runner.value);
        return;}
    //Allg. Fall
    do{
    System.out.println(runner.item + " " + runner.size + "," +runner.value);
           runner = runner.next;
    }while (runner.next != null);
}
}
```

Interessant ist aber nur 
	
	
	
	





```
// suche das groeßte Element
public int searchBig(int i){
int temp = 24-i;
LinkedListElemente runner = this;
if (runner.value >= temp) {System.out.println("Fertig"); return 25;};
//System.out.println("Anfangswert runner" + runner.value);
while (runner.next.value<=temp && runner.next.value!= 0)
{runner=runner.next;};
//System.out.println("Endwert runner" + runner.value);
return runner.value;
}
```

Besten Dank schonmal!


----------



## André Uhres (19. Mai 2009)

Eine Methode kann mit return nur einen einzigen Wert zurückgeben. Möchte man mehrere Werte zurückgeben, so kann dies über Referenzen auf Objekte in der Parameterliste gehen oder über die Schaffung eines Objektes mit mehreren Datenfeldern, auf das mit return eine Referenz zurückgegeben wird.
Die Methode searchBig wird doppelt durchlaufen, weil sie zweimal aufgerufen wird:

```
if (alle.searchBig(actGroeße) == 25) {//<-------------------------------
    break;
}
actGroeße = actGroeße + alle.searchBig(actGroeße);//<-------------------------------
```


----------



## faetzminator (19. Mai 2009)

```
int size = searchBig(actGroesse);
if (size == 25) {
    break;
}
actGroesse += size;
```

ah ja, wie du gerade merkst ist das ß nicht gerade ein tolles Zeichen in Code.


----------



## chik (19. Mai 2009)

Jo besten Dank für eure Hilfe.

Hab das jetzt realisiert, vielleicht hilft es ja jemanden:


```
public class LinkedListElemente { 
private Object item;
private Object size;
private int value;
private LinkedListElemente next; 
public LinkedListElemente() { } 

private LinkedListElemente(Object i, LinkedListElemente n) { 
    item = i; 
    next = n; 
}

public static void main(String[] args){
LinkedListElemente Alle = new LinkedListElemente();
Alle.insertlast("A",3,4);
Alle.insertlast("B",4,5);
Alle.insertlast("C",7,10);
Alle.insertlast("D",8,11);
Alle.insertlast("E",9,13);
System.out.println("Kontrollausgabe nach dem Anlegen");
System.out.println("Verfügbar");
Alle.ausgeben();
System.out.println("Gesamt Größe " + Alle.getSize());
int actGroeße = 0;
System.out.println("Anfangswert Rucksackfüllung " + actGroeße);
while (actGroeße <24){
    if (Alle.searchBig(actGroeße)==null){break;};
    System.out.println("Hinzugefügt " + Alle.searchBig(actGroeße).item + " mit dem Wert " + Alle.searchBig(actGroeße).value);
    actGroeße=actGroeße+Alle.searchBig(actGroeße).value;
//System.out.println("Zwischen Größe " + actGroeße);
}
System.out.println("Endwert Rucksackfüllung" + actGroeße);
}



// suche das groeßte Element
public LinkedListElemente searchBig(int i){
int temp = 24-i;
LinkedListElemente runner = this;
if (runner.value > temp) {System.out.println("Es passt nichts mehr in den Rucksack"); return null;};
while (runner.next.value<=temp && runner.next.value!= 0)
{runner=runner.next;};
return runner;
}

public int getSize(){
int x=0;
LinkedListElemente runner = this;
while (runner.next != null){
    runner = runner.next;
    x=x+runner.value;
}
return x;
}
 
public void insertlast(Object gegenstand, Object groeße, int wert) { 
    if (item == null) { 
        item = gegenstand;
        size = groeße;
        value = wert;
        next = new LinkedListElemente(); 
    } else 
    next.insertlast(gegenstand, groeße, wert); 
}
 

public void ausgeben(){
    System.out.println("==============" + "Ausgabe" + "==============");
    LinkedListElemente runner = this;
    //Kein Element Fall
    if (runner == null) {return;};
    //Nur 1 Element Fall
    if (runner.next == null) {
        System.out.println(runner.item + "," + runner.size + "," +runner.value);
        return;}
    //Allg. Fall
    do{
    System.out.println(runner.item + " " + runner.size + "," +runner.value);
           runner = runner.next;
    }while (runner.next != null);
}
}
```


----------

