Mittelwert aller Zahlen aus Textdatei ermitteln

sakizzo

Mitglied
hi leute!

Brauche Hilfe, mit meinem Programm:

Java:
import java.io.*;
import java.util.*;

public class Mittelwert {
	public static void main(String[] args) {
		try {
			File path = new File("test/testdatei.txt");
			System.out.println(meanValueOf(path));
		} catch (Exception e) {
			System.out.println("Fehler beim Einlesen");
		}
	}

	public static double meanValueOf(File path) throws Exception {
		BufferedReader br = new BufferedReader(new FileReader(path));
		Scanner in = new Scanner(br);

		int counter = 1;
		double number = 0.0;
		double ret = number / counter;

		while (in.hasNext()) {

			if (in.hasNextInt() || in.hasNextDouble()) {
				if (in.hasNextInt()) {
					number = number + Double.parseDouble(in.next());
					counter++;
				} else {
					number = number + Double.valueOf(in.next()).doubleValue();
					counter++;
				}

			} else {
				
 //Token überspringen und wieder zur if Abfrage mit nächstem token
	
		}

		}
		return ret;
	}
}

In der Methode meanValueOf() habe ich in der while Schleife eine If-Abfrage, wo ich nicht weiß, wie ich das ELSE definiere (DER GRUENE KOMMENTAR). Die Methode soll aus einer Datei lesen und den Mittelwert aller Zahlen ermitten und zurückgeben. Die Datei beinhaltet Double, Int und String-Werte in beliebiger Reihenfolge (zB.: 2 32 43 56.5 testext 76 23.3 56). Habe ich sonst noch Fehler im Programm oder habt ihr Verbesserungsvorschläge?

Danke dafür, sakizzo
 
Hi,

mit:
Code:
in.useDelimiter(" ");
kannst du festlgen das in.next(); dir den nur den Text bis zum nächsten Leerzeichen zurück gibt.
Du hast aber da noch ein paar Fehlerchen im Programm aber die wirst du wohl dann auch schnell finden ;)

Gruß
Erik
 
Meiner Meinung nach ist das hier falsch:

Code:
        int counter = 1;
        double number = 0.0;
        double ret = number / counter;

Du lässt ret schon berechnen bevor du counter und number veränderst. Das heißt ret wird sich nie ändern! Auch wenn sic count und number ändert!
 
Warum so kompliziert?

Java:
import java.io.*;
 
public class Mittelwert
{
    public static void main(String[] args)
    {
        try
        {
            File path = new File("file.txt");
            System.out.println(meanValueOf(path));
        }
        catch (Exception e)
        {
            System.out.println("Fehler beim Einlesen");
        }
    } 
    private static double meanValueOf(File file) throws IOException //String can be a path, File contain may a Path, but is a File-Instance
    {
    	FileReader reader = new FileReader(file);
 
        double result = 0.0d;
 
        try
        {
            for(String nextString = null; (nextString = readNextString(reader)) != null;)
            {
            	try
            	{
            		double nextStringAsDouble = Double.parseDouble(nextString);
            		result = ((result + nextStringAsDouble) / 2);
            	}
            	catch (NumberFormatException e) {}
            }
        }
        catch (IOException e)
        {
			throw e;
		}
        catch (Exception e)
        {
			e.printStackTrace();
		}
        return(result);
    }
    private static String readNextString(FileReader reader) throws IOException
    {
    	String nextString = null;
    	
    	int incomingInt = 0;
    	for(; (incomingInt = reader.read()) != -1 && incomingInt != 13 && incomingInt != ' ';)
    	{
    		String s = String.valueOf((char)incomingInt);
    		if(nextString == null)
    			nextString = s;
    		else
    			nextString+= s;
    	}
    	if(incomingInt == 13)
    		reader.read(); //Skip char 10, Line Wrappler = char 13, char 10
    	return(nextString);
    }
}
 
wie müsste ich aber folgenden Code verändern, damit es mit meiner Methode funktioniert?

Java:
import java.io.*;
import java.util.*;

public class Mittelwert {
	public static void main(String[] args) {
		try {
			File path = new File("test/testdatei.txt");
			System.out.println(meanValueOf(path));
		} catch (Exception e) {
			System.out.println("Fehler beim Einlesen");
		}
	}


	public static double meanValueOf(File path) throws Exception {
		Scanner in = null;
		in = new Scanner(path);

		int counter = 0;
		double number = 0.0;

		if (in.hasNextInt() || in.hasNextDouble()) {

			number += in.nextDouble();
			counter++;
			while (in.hasNext()) {
				in.next();
			}
		}

		if (counter == 0) {
			return 0.0;
		} else {
			return number / (double) counter;
		}
	}
}
 
Zuletzt bearbeitet von einem Moderator:
Hi,

Kai008 hat dir doch schon eine praktisch komplette Lösung gegeben?

Außerdem scheint mir dein Code auf den ersten Blick nicht so wirklich toll...
Java:
        if (in.hasNextInt() || in.hasNextDouble()) {
 
            number += in.nextDouble();
            counter++;
            while (in.hasNext()) { // <-- Das hier liest doch alles bis zum Ende durch.
                in.next();         // Das ist doch nicht wirklich der gewünschte Effekt oder?
            }
        }
 
Ja die Lösung ist ja auch gut, aber ich wollte halt eher wissen, wie man meine (wenn auch aufwendiger) Idee verwirklichen kann.
Du hast recht, die while Schleife ist unsinnig, da er alle weiteren eingelesenen Sachen einfach nur Skipt!...
Naja wenn es zu kompliziert ist oder so, dann ist es ok.
Trotzdem danke...
 
Ich habe das heute nocheinmal bearbeitet.
Es funktioniert jetzt auch, dass der Richtige Mittelwert rauskommt, aber es gibt nur noch 1 Problem.
Wenn ich das Programm teste zählt er IMMER das letzte, was in der Datei steht als STRING, egal ob ich dazwischen noch etwas rein schreibe, ein INT wert oder Double zum Schluss nehme,...! Und ich kann den Fehler nicht finden, warum das so ist! Es kann ja sein, dass der so banal ist, aber ich den Überblick schon verloren habe....
Also hier nocheinmal der Code, danach der Text aus der Datei und dann die Ausgabe:
Java:
import java.io.*;
import java.util.*;

public class Mittelwert {
	public static void main(String[] args) {
		try {
			File path = new File("test/testdatei.txt");
			System.out.printf("Der Mittelwert aller Zahlen aus der Datei "
					+ path + ": %.2f....", meanValueOf(path));
			
		} catch (Exception e) {
			System.out.println("Fehler beim Einlesen");
		}
	}

	public static double meanValueOf(File path) throws Exception {
		Scanner in = null;
		in = new Scanner(path).useDelimiter(" ");

		int counter = 0;
		double number = 0.0;
		ArrayList<String> al = new ArrayList<String>();
		while (in.hasNext()) {

			if (in.hasNextInt()) {

				number += in.nextInt();
				counter++;
			} else if (in.hasNextDouble()) {
				number += in.nextDouble();
				counter++;
			} else {
				al.add(in.next());
			}
		}

		if (counter == 0) {
			return 0.0;
		} else {

				System.out.print("Ausgelesene Strings: "+al);
				System.out.println("");
			return number / (double) counter;
		
		}
		
		
	}
}

Text aus der Datei: 4 32 56 56,5 testext 76 23,3 53 test man 3 34,2 4,2 ds 9 d 43
Ausgabe: Ausgelesene Strings: [testext, test, man, ds, d, 43
]Der Mittelwert aller Zahlen aus der Datei test\testdatei.txt: 31,93....
 
Zuletzt bearbeitet von einem Moderator:
Zurück