# Arrays Min und Max



## Dante1341 (7. Jan 2011)

Hey Leute , 

hab mal ne kurze Frage : Ich habn Programm geschrieben in dem der User am Anfang die Größe einer Arrays bestimmt und anschließend diese Zahlen eingibt d.h. wenn er für de Größe des Arrays "n" 3 eingibt , kann er 3 Zahlen eingeben z.B. 4,3,5 .

Eigentlich funktioniert alles super mich verwirrt nur eines ... 

Mein Minimum funktioniert so : 


```
public static double min(double[] data){
	double minimum = data[0];   
    for (int i=1; i<data.length; i++) {
        if (data[i] < minimum) {
        	minimum = data[i];   
        }
    }
    return minimum;
}
```

Wieso muss ich 
	
	
	
	





```
double minimum = data[0];
```
 data 0 und nicht data 1 schreiben damit er mit dem ersten Wert beginnt ? ICh hoffe ihr versteht was ich meine ... Hab wahrscheinlich grad irgendwas verpeilt ^^ ...


----------



## eRaaaa (7. Jan 2011)

Weil ein Array halt immer bei dem Index 0 beginnt?!
Ne also was genau ist jetzt deine Frage? Du vergleichst ja immer das aktuelle Element mit dem aktuellen Minimum. Am Anfang hast du ja aber kein Minimum --> du sagst also einfach ,dein aktuelles Mimimum ist das Element an Index 0 und vergleichst dann eben ab Element 1!

Element1 < Element 0 ? ja --> sage neues Minimum ist Element[1], nein ? --> mache mit ELement[2] weiter usw....


----------



## Dante1341 (7. Jan 2011)

Alles klar ^^Warja nur ne Frage  Aber eine Sache wär da noch ... 


```
public static double arrayStats(double[] data){
	double summe = 0 ;
	
	for (double i=0;i<=data.length;i++){
		summe +=i;
	}
double liste[]={min(data),max(data),(summe/data.length)};

return ...
```

Hier wollte ich in einem Array Minimum , Maximum und Arithmetisches Mittel speichern und später bei Bedarf ausgeben ... return liste[] z.B. kann ich ja nicht schreiben ... Was mach ich da falsch ?


----------



## SlaterB (7. Jan 2011)

return liste;
kannst du schreiben, aber überlegen, ob das zum deklarierten Rückgabewert passt


----------



## Dante1341 (7. Jan 2011)

Hab ich gemacht , aber damit das passt musste ich es so umändern : 


```
public static double[] arrayStats(double[] data){
	double summe = 0 ;
	
	for (double i=0;i<=data.length;i++){
		summe +=i;
	}
double liste[] ={min(data),max(data),(summe/data.length)};

return liste;
}
[\JAVA]

Ich kann dass aber im main Teil nicht ausgeben ... Sowas hab ich im Main Teil : 

[code=Java]
double min = min(data);
double max = max(data);


System.out.println("min = "+ min);
System.out.println("max = "+ max);

System.out.println("arrayStats = " + arrayStats);
[\JAVA]

Irgendeine Kleinigkeit fehlt da ... aber ich komm nicht drauf ...
```


----------



## Dante1341 (7. Jan 2011)

Hab ich gemacht , aber damit das passt musste ich es so umändern : 


```
public static double[] arrayStats(double[] data){
double summe = 0 ;

for (double i=0;i<=data.length;i++){
summe +=i;
}
double liste[] ={min(data),max(data),(summe/data.length)};

return liste;
}
```

Ich kann dass aber im main Teil nicht ausgeben ... Sowas hab ich im Main Teil : 


```
double min = min(data);
double max = max(data);


System.out.println("min = "+ min);
System.out.println("max = "+ max);

System.out.println("arrayStats = " + arrayStats);
```

Irgendeine Kleinigkeit fehlt da ... aber ich komm nicht drauf ...


----------



## SlaterB (7. Jan 2011)

was willst du in der main denn machen? von einem Aufruf der Methode arrayStats ist dort noch nichts zu sehen,
Methoden ruft man auf bestimmte Weise auf, an Klammern und Parameter denken..


----------



## Herr K. (7. Jan 2011)

Hallo Dante,

Du möchtest in Deiner letzen Zeile die Statistik zu einem Array ausgeben. So, ich denke mir mal drei Zahlen aus, jetzt gib mir mal die Statistik. Na bitte, ich warte... Wie, kannst Du nicht? Weil Du die Zahlen nicht kennst?! ;-)

Java kann auch nicht raten, deshalb muss Du einer Methode (wie arrayStats) auch ein Argument übergeben. Dafür schreiben man eine öffnen Klammer hin, die Variablen durch Komma getrennt und dann eine schließende Klammer, also z.B.

```
System.out.println("arrayStats = " + arrayStats(data));
```

Schauen wir uns jetzt noch die Signatur der Methode an:

```
public static double[] arrayStats(double[] data)
```
Hier steht, dass Du eine Methode hast, die arrayStats heißt. Als Argument musst Du genau ein Feld von double-Werten übergeben und zurück bekommst Du auch ein Feld von double-Werten. Ein Feld sind einfach Werte, die Du über einen Index ansprechen kannst. Zum Beispiel kannst Du Dir gezielt das erste, zweite, dritte oder was auch immer Element zurückgeben lassen. Natürlich gibt es Dinge die nicht gehen, z.B. den Wert vor dem ersten Wert (den -1sten) zu ermitteln, denn sowas gibt's ja nicht. Auch kannst Du nicht auf einen Wert hinter dem Feld zugreifen, auch die gibt es ja nicht. 

In Deinem Fall ist das dann leicht, Du erwartest ja genau ein Feld der Länge 3, wobei an der ersten Stelle das Minimum, an der zweiten Stelle das Maximum und am Schluss der Durchschnitt steht). 

```
// speichern der Statistik in der Variable result
double result = arrayStats(data);
// Ausgabe des Minimums
System.out.println(data[0]);
// Ausgabe des Maximums
System.out.println(data[1]);
// Ausgabe der Zahl 1
System.out.println(data[2]);
```

So, damit Du auch noch etwas nachdenken musst, warum steht ganz unten "Ausgabe der Zahl 1"? Schau Dir das mal an


----------



## SlaterB (7. Jan 2011)

wenn dann ja wohl
double[] result = arrayStats(data);
System.out.println(result[0]);
usw.


----------



## Dante1341 (7. Jan 2011)

Danke Euch ! Also so geht das ganze auf jeden Fall schon einmal : 


```
import java.io.IOException;

class arrayMinMax {

public static void main(String[] args) throws IOException{

System.out.println("Bitte geben Sie n ein:");
String input = Input.readString();
int n = Integer.valueOf( input ).intValue();


double data[] = new double[n];


for(int i=0; i<n; i++){

input = Input.readString();
data[i] = Double.valueOf( input ).doubleValue();

}

double min = min(data);
double max = max(data);


System.out.println("min = "+ min);
System.out.println("max = "+ max);


//speichern der Statistik in der Variable result
double[] result = arrayStats(data);
// Ausgabe des Minimums
System.out.println(result[0]);
//Ausgabe der Zahl 1
System.out.println(result[2]);
// Ausgabe des Maximums
System.out.println(result[1]);


}

public static double min(double[] data){
double minimum = data[0]; 
for (int i=1; i<data.length; i++) {
if (data[i] < minimum) {
minimum = data[i];
}
}
return minimum;
}

public static double max(double[] data) {
double maximum = data[0]; 
for (int i=1; i<data.length; i++) {
if (data[i] > maximum) {
maximum = data[i]; 
}
}
return maximum;
}

public static double[] arrayStats(double[] data){
	double summe = 0 ;
	
	for (double i=0;i<=data.length;i++){
		summe +=i;
	}
	double liste[] ={min(data),max(data),(summe/data.length)};

return liste;
}

}
```

Aber eigentlich wollte ich ja nicht 3 mal System.println ... wieso geht so etwas denn nicht ? :

```
System.out.println("ArrayStats"+ result );
```

da krieg ich als Ergebnis so etwas : ArrayStats[D@54fc9944


----------



## Dante1341 (7. Jan 2011)

dass mit zahl 1 geht nur wenn man 3 zahlen eingibt ... sons nicht mehr ...


----------



## Final_Striker (7. Jan 2011)

Weil ein Array ein Objekt ist.

kannst z.B. 


```
System.out.println(Arrays.toString(result));
```

verwenden


----------



## F.S.WhiTeY (7. Jan 2011)

Das geht nicht, weil du das Object ausgibst und nicht den Inhalt. 

Kleine erweiterung zur Array-Theorie:

wir legen ein Array an:

int[] arr = new int[100];

dann zeigt arr als "zeiger" auf einen definierten/reservierten Speicherbereich z.B. Speicherstelle 5000

Ein int hat 32 bit, wir wollen 100 int's speicher also 32x 100 = 3200 --> wir belegen Speicherstelle 5000 bis 8200 (Sehr abstrackt!!)

Dann zeigt arr auf die speicherstelle 5000 und genau das gibt er dir aus 

Wenn wir nun an der stelle 1 einfügen wollen -->arr[1]

Dann zählt der Compiler für uns und sagt: wir fangen bei 5000 an ( zeiger arr ) und wollen den zweiten int einfügen.. also fange ich an bei 5033 zu schreiben und habe bis 5064 platz. 

Ergo: Ein Object ist ersteinmal eine Refferenz auf einen Speicherbereich.


----------



## Final_Striker (7. Jan 2011)

F.S.WhiTeY hat gesagt.:


> Ergo: Ein Object ist ersteinmal eine Refferenz auf einen Speicherbereich.



Eine Referenz verweist auf ein Objekt im Speicher.


----------



## Dante1341 (7. Jan 2011)

Ich danke euch allen


----------



## F.S.WhiTeY (8. Jan 2011)

Final_Striker hat gesagt.:


> Eine Referenz verweist auf ein Objekt im Speicher.



Über die aussage Object im Speicher kann man sich nun streiten bzw. ich müsste ehrlichgesagt nachlesen. Aber deine Korrektur als solche ist natürlich richtig, danke ^^


----------

