# mehrere double Werte einlesen



## Jo.Mo. (2. Jan 2011)

Hallo, ich schreibe gerade ein Programm mit mehreren Methoden zu Mittelwertsberechnung. Jetzt habe ich ein Problem mit der Wertübergabe oder besser mit der Werteingabe. Ich habe bisher immer Werte als Parameter an die Methode übergeben, jetzt habe ich allerdings versucht, eine Auswahlmöglichkeit zur Berechnung anzubieten, und scheitere daran, dass ich nicht weiss wie ich die Werteingabe am elegantesten löse...

Gibt es eine Vereinfachte Lösung, wie man mehrere Double-Werte möglichst in einem "Rutsch" einlesen kann? 

Hier mal mein Programm, ich denke dann wird klar was ich meine... 



```
class Statistik {

public static void main(String[] args) {

    	System.out.println(".. Mittelwertsberechnungen ..");

    	stdin in = new stdin();
    	char key;

	    loop: while (true) {
	     	printMenue();
	    	key  = in.getChar("");

	    	switch (key) {
		      	case 'a': case 'A': arith(); break;
		    	case 'g': case 'G': geom(); break;
		    	case 'e': case 'E': break loop;
		    	default : System.out.println("Was wollen Sie???");
	    	} // switch key
	} // while (true)

    System.out.println("\n.. End of Program ..");

} // main


static void printMenue() {
	System.out.println("\nWas wollen Sie berechnen?");
	System.out.println("  arithmetisches Mittel (A)");
	System.out.println("  geometrisches Mittel (G)");
 	System.out.println("  Exit (E)");
} // printMenue



static double arith (double... values) {
    double sum = 0;
    for (double d : values)
    	sum += d;

    return sum/values.length;
} //Ende Methode arithmetisches Mittel


//geometrisches Mittel
static double geom (double... values) {
    double sum = 1;
    for (double d : values)
    	sum *= d;

    return Math.pow(sum, 1.0/values.length);
} //Ende methode geometrisches Mittel




}
```


----------



## Marco13 (2. Jan 2011)

Aus einer Datei lesen? Oder meinst du, dass man nicht
1.2 [ENTER]
3.2 [ENTER]
2.4 [ENTER]
eingeben muss, sondern z.B,
1.2 3.2 2.4 [ENTER]
eingeben kann?


----------



## Jo.Mo. (2. Jan 2011)

Hallo,

im ersteren Falle könnte ich es ja zur Not mit einer schleife lösen, denke ich. Also Abfrage, wieviel werte eingelesen werden sollen (zB 5), die nacheinander mittels for (i=1, i <=5, i++)einlesen.

Aber ich dachte,so wie du es danach angesprochen hast, ob es vielleicht möglich ist 5 werte so anzugeben [1.3 4.2 3.1. 5.2 1.6]... :-/


----------



## eRaaaa (2. Jan 2011)

Gibt mehrere Möglichkeiten.
Entweder bei jedem Leerzeichen splitten (siehe String.split) und das String-Array selbst durchlaufen und zu Double parsen (Double.parseDouble), oder evtl. mit zwei Scanner-Instanzen ala`

```
Scanner sc = new Scanner(System.in); // z.B. 1,2 3,2 2,4 [ENTER] (Komma, nicht Punkt)
		Scanner digits = new Scanner(sc.nextLine()); 
		while(digits.hasNextDouble()){
			System.out.println(digits.nextDouble()); //z.b. in eine Liste ablegen ?!
		}
```

oder noch ein paar Andere 

Was ist eig. [c]new stdin();[/c] ???


----------



## Jo.Mo. (2. Jan 2011)

...jaa, genau sowas meinte ich - und das mit dem komma hätte ich auch nicht gewusst, sonst nutzt man ja immer den Punkt. 

...nur muss ich da jetzt nochmal nachfrage, wie du das mit der liste meinst? Also ein array, oder was?


...das new stdin ist (hoffe ich sage jetzt nicht syntaktisch falsches) doch die Initialisierung einer neuen abfrage (Buchtsbe für die Methodenauswahl) - habe das ansatzweise aus einem früher im Lehrstoff behandelten programm verwendet.

Da ich die Werte ja in beiden Methoden nutze, kann ich die Werte doch dann in der Main-Methode in eine Liste (ich vermute ein Array wär das beste?) speichern, und unter dessen Namen in der jeweiligen Methode aufrufen/verwenden, richtig?


----------



## eRaaaa (2. Jan 2011)

Jo.Mo. hat gesagt.:


> ...nur muss ich da jetzt nochmal nachfrage, wie du das mit der liste meinst? Also ein array, oder was?



Ich hatte mir da noch nichts weiter bei gedacht, das war einfach nur erst einmal nur so eine Anmerkung. Ein Array (double[] ) würde sich anbieten, da deine Methoden an sich ja ein double-Array erwarten (double... value), dafür müsstest du natürlich aber auch wieder wissen wie viele Werte eingegeben wurden, da du diese ja bei der Array-Initialisierung wissen musst. Man könnte diese evtl. aber auch zu 
	
	
	
	





```
Double... values
```
 ändern und dann oben eine normale Liste wie ArrayList o.ä., benutzen, diese füllen und dann toArray(new Double[]{}) verwenden welche man ja dann auch deinen Methoden übergeben könnte. (edit: oder man lässt die Array Geschichte ganz weg und benutzt direkt Listen)

p.s.: Bei der Sache mit dem Komma+Punkt, da könnte man sich evtl. mit so etwas wie : Scanner digits = new Scanner(sc.nextLine().replace(".", ",")) behelfen. Dann würde beides akzeptiert werden


----------



## Davide (2. Jan 2011)

Ja für das einlesen gibt es einige Möglichkeiten. Man könnte auch mit einem BufferedReader den String einlesen, spliten und dann zu double parsen. Dann gehts auch mit Punkt. 

Was anderes, wäre es nicht ein bisschen eleganter den char zu verkleinern? 
[Java]
switch (Character.toLowerCase(key)) {
                case 'a': arith(); break;
                case 'g': geom(); break;
                case 'e': break loop;
                default : System.out.println("Was wollen Sie???");
            } // switch key

[/Java]


----------



## Jo.Mo. (2. Jan 2011)

@Davide: klar, auf sowas hab ich erstmal nicht geachtet, aber gut zu wissen, habs geändert. 

Bin schnell durch das Programm durch, habs noch nicht auf Lauffähigkeit probiert, kommt das so hin...?


```
import dssz.io.*;
class Statistik {

public static void main(String[] args) {

    	System.out.println(".. Mittelwertsberechnungen ..");
    	
    	Scanner sc = new Scanner(System.in); // Eingabe der double-Werte hintereinander
        Scanner digits = new Scanner(sc.nextLine()); 
        while(digits.hasNextDouble()){
            System.out.println(digits.nextDouble()); 
            double[] values = digits.toArray(new Double[]);	
        }

    	stdin in = new stdin();
    	char key;

	    loop: while (true) {
	     	printMenue();
	    	key  = in.getChar("");

	    	switch (Character.toLowerCase(key)) {
		      	case 'a': arith(); break;
		    	case 'g': geom(); break;
		    	case 'e': break loop;
		    	default : System.out.println("Was möchten sie?");
	    	} // switch key
	} // while (true)

    System.out.println("\n.. End of Program ..");

} // main


static void printMenue() {
	System.out.println("\nWas wollen Sie berechnen?");
	System.out.println("  arithmetisches Mittel (A)");
	System.out.println("  geometrisches Mittel (G)");
 	System.out.println("  Exit (E)");
} // printMenue



//arithmetisches Mittel
static double arith (double... values) {
    double sum = 0;
    for (double d : values)
    	sum += d;

    return sum/values.length;
} //Ende Methode arithmetisches Mittel


//geometrisches Mittel
static double geom (double... values) {
    double sum = 1;
    for (double d : values)
    	sum *= d;

    return Math.pow(sum, 1.0/values.length);
} //Ende methode geometrisches Mittel




}
```


----------



## Jo.Mo. (2. Jan 2011)

...könnte das in der Form auch klappen...?


```
//Wie viele werte?
int n = in.getInt("Wie viele Werte?");

double [] values = new double[n];
for (int i = 0; i < value.length; i++)
    values [i] = in.getdouble ("Wert Nr." + i + ":");
```

...die oben genannte form ist zwar eleganter als meins, aber ich weiss grad nicht, wie ich das lösen soll,  sporich die Werte in den array packen, mit diesm toArray bin ich nicht ganz firm...


----------



## Davide (2. Jan 2011)

[Java]
ArrayList<Double> val = new ArrayList<Double>();

        while(digits.hasNextDouble()) {
            val.add(digits.nextDouble());
        }

        Double[] values = val.toArray(new Double[val.size()]);
[/Java]
Oder wie eRaaaa bereits erwähnt hat, man überglibt gleich die Liste ohne es in ein Array zu packen.


----------



## Jo.Mo. (2. Jan 2011)

...double gross geschrieben...?


----------



## Davide (2. Jan 2011)

Ja,  das Array kannst du dann aber ganz normal deiner Methode übergeben.


----------



## Final_Striker (2. Jan 2011)

Jo.Mo. hat gesagt.:


> ...double gross geschrieben...?



Java ist auch eine Insel – 8.2 Wrapper-Klassen


----------



## eRaaaa (2. Jan 2011)

Davide hat gesagt.:


> Ja,  das Array kannst du dann aber ganz normal deiner Methode übergeben.



Leider nicht. Deshalb oben meine Anmerkung, dass die Methodensignaturen dann zu 
	
	
	
	





```
Double ... values
```
 geändert werden müssten.


----------



## Davide (2. Jan 2011)

eRaaaa hat gesagt.:


> Leider nicht. Deshalb oben meine Anmerkung, dass die Methodensignaturen dann zu
> 
> 
> 
> ...



Ok, das wusste ich nicht, hab angenommen das es funktionieren würde. 
Wieder was gelernt.


----------



## Jo.Mo. (2. Jan 2011)

...Wrapper...kannte ich noch gar nicht, muss ich mir morgen mal in Ruhe ansehen...nur will ich das Programm noch lauffähig bekommen....

...daher  muss ich nochmal fragen:

ArrayList - Name des Arrays? und für was steht die eckige Klammer? Hab ich auch noch nie benutzt.... Ich denkt da zu schnell für mich, das sind noch grad alles böhmische Dörfer... :-/


----------



## Jo.Mo. (2. Jan 2011)

...ich bin  zu doof, java kotzt mich an....wo liegt denn da jetzt der Fehler - muss ich den Array anders bennen, erst noch initialisieren, liegts an den eckigen Klammern...Ich glaube ich seh den Wald vor lauter Bäumen nicht, sitzt da jetzt seit 3 Stunden dran...


```
import dssz.io.*;
import java.util.Scanner;

class Statistik {

public static void main(String[] args) {

    	System.out.println(".. Mittelwertsberechnungen ..");

    	Scanner sc = new Scanner(System.in); // Eingabe der double-Werte hintereinander
        Scanner digits = new Scanner(sc.nextLine());

        ArrayList<Double> val = new ArrayList<Double>();

        while(digits.hasNextDouble()) {
            val.add(digits.nextDouble());
        }

        Double[] values = val.toArray(new Double[val.size()]);

    	stdin in = new stdin();
    	char key;

	    loop: while (true) {
	     	printMenue();
	    	key  = in.getChar("");

	    	switch (Character.toLowerCase(key)) {
		      	case 'a': arith(); break;
		    	case 'g': geom(); break;
		    	case 'e': break loop;
		    	default : System.out.println("Was möchten sie?");
	    	} // switch key
	} // while (true)

    System.out.println("\n.. End of Program ..");

} // main


static void printMenue() {
	System.out.println("\nWas wollen Sie berechnen?");
	System.out.println("  arithmetisches Mittel (A)");
	System.out.println("  geometrisches Mittel (G)");
 	System.out.println("  Exit (E)");
} // printMenue



//arithmetisches Mittel
static double arith (Double... values) {
    double sum = 0;
    for (double d : values)
    	sum += d;

    return sum/values.length;
} //Ende Methode arithmetisches Mittel


//geometrisches Mittel
static double geom (Double... values) {
    double sum = 1;
    for (double d : values)
    	sum *= d;

    return Math.pow(sum, 1.0/values.length);
} //Ende methode geometrisches Mittel


}
```


----------



## eRaaaa (2. Jan 2011)

Fehlermeldungen posten hilft immer, in sofern es welche gibt!

[c]import java.util.ArrayList;[/c] fehlt anscheinend


----------



## Jo.Mo. (2. Jan 2011)

...ajo, ich sags ja, der Wald und die Bäume... ...jetzt muss ich nur noch die rückgabe und Ausgabe managen...


----------

