import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.StringTokenizer;
class Test
{
public static void main(String args[])
{
FileReader fileInput = null; //file reader um das Eingangsfile zu öffnen
String strLineOfFile = ""; //representiert immer genau eine Linie des Files das eingelesen wird
int iQuantity = 0; //die Gesamtzahl der personen im File
int iWomenQuantity = 0; //die Anzahl der Frauen im File
int iMenQuantity = 0; //Die Anzahl der Männer im File
int iAgeBorder = 18; //Hiermit kann man die Grenze 18 Jahre setzen. z.b. auf 30 oder was auch immer
try
{
fileInput = new FileReader("Textdokument.txt"); //öffne das File damit wir lesen können
}
catch (FileNotFoundException e)
{
System.out.println("File not found");
System.exit(0);
}
BufferedReader buffReader = new BufferedReader(fileInput); //mach aus dem file_handle einen stream
StringBuffer strBuff = new StringBuffer(100); //dient als Puffer um die Einzelzeilen des File zusammen zu fügen
try
{
strLineOfFile = buffReader.readLine(); //holt sich die erste Zeile aus dem File
while(strLineOfFile != null) //prüft ob das Ende des Files noch nicht erreicht ist (leeres File?)
{
strBuff.append(strLineOfFile); //fügt die gelesene Zeile dem Puffer hinzu
strBuff.append(","); //fügt ein Komma ein damit der Tokenizer die Zeilen sauber trennen kann sonst stände da z.b. (18m 24w)
strLineOfFile = buffReader.readLine(); //holt sich die nächste Linie
}
}
catch (IOException e1)
{
System.out.println("IOException on Textdokument.txt. Programm stoped");
System.exit(0);
}
StringTokenizer tokenNiz = new StringTokenizer(strBuff.toString(), ",", false); //separiert den Inhalt durch komma, komma selber ist kein Token
List personList = new ArrayList(); //die Liste die nun die Personen aufnehmen wird.
while (tokenNiz.hasMoreTokens())
{
personList.add(tokenNiz.nextToken()); //füge die einzeltoken also z.b. '18w' zur Liste hinzu
iQuantity++; //inkrementiere die gesammtzahl der personen um 1
}
int[] list_women = new int[personList.size()]; //jetzt trennen wir die Personen nach weiblein
int[] list_men = new int[personList.size()]; //und mänlein. Da wir später rechnen wollen direkt in ein int array
for(int i = 0; i < personList.size(); i++)
{
String strActualPerson = (String)personList.get(i); //hole dir das erste pesönchen z.b. 20m
strActualPerson.trim(); //sollten am Zeilenende mal leerzeichen gewesen sein z.b. '20m ' schnippel sie weg
if(strActualPerson.endsWith("w")) //bist du weiblich?
{
list_women[i] = Integer.parseInt(strActualPerson.substring(0,strActualPerson.length() - 1)); //parse die Zahl ins array
}
else if(strActualPerson.endsWith("m")) //bist du mänlich?
{
list_men[i] = Integer.parseInt(strActualPerson.substring(0,strActualPerson.length() - 1)); //parse die Zahl ins array
}
else
{
System.out.println("Warning, we got something not male nor female. ignored"); //whats that? Es ist nicht mänlich noch weiblich?
}
}
//hier stehen die Daten nun in loser Reihenfolge im Array
//da oben i über beide Arrays inkrementiert wird entsehen '0' lücken im array
//Also z.b.
// 24m,23m,24w,22m,35w,22w,18m
// 12m,25m,56w,33m,35w,45w,19w
// Wird zu
// Mänliches Array : 24,23,0 ,22, 0, 0,18,12,25, 0,33, 0, 0, 0
// Weibliches Array: 0 , 0,24, 0,35,22, 0, 0, 0,56, 0,35,45,19
// Was Auffällt ist das an jeder Stelle wo das mänliche Array 0 ist das weiblich einen wert hat und umgekehrt.
// Das kann man aber oben ersehen da wie gesagt beide Auswertungen über das selbe 'i' inkrementiert werden
Arrays.sort(list_women); // siehe eine zeile tiefer
Arrays.sort(list_men); //sortiere die Arrays hier steht danach z.b. 0,0,0,0,0,0,0,12,18,22,23,2425,33
int iWomenUnder18 = 0; //Anzahl der Frauen unter dem Mindesalter
for(int i = 0; i < list_women.length; i++) //laufe über alle Frauen
{
if(list_women[i] != 0) //ignoriere die 0 Einträge
{
iWomenQuantity++; //Anzahl der Frauen Absolut (ohne Altersbeschränkung)
if(list_women[i] < iAgeBorder)
{
iWomenUnder18++;
}
}
}
int iMenUnder18 = 0; //Same prozedure wie oben nur für das mänliche Geschlecht
for(int i = 0; i < list_men.length; i++)
{
if(list_men[i] != 0)
{
iMenQuantity++;
if(list_men[i] < iAgeBorder)
{
iMenUnder18++;
}
}
}
//Wir wollen ja nicht 25.423445345634534534534534543% als Ausgabe
//Deshalb formatieren wir auf 3 Stellen vor, 2 Stellen hinter und einem % Zeichen
DecimalFormat myFormat = new DecimalFormat("###.##%");
//Ermittle den Prozentualen Anteil z.b. 0.52434343545 wäre später dann 52.43%
double dWomen = (double)iWomenUnder18/(double)iWomenQuantity;
double dMen = (double)iMenUnder18/(double)iMenQuantity;
//Gib den Schrott aus
System.out.println("women under " + iAgeBorder + " (based all women only):" + myFormat.format(dWomen));
System.out.println("men unter " + iAgeBorder + " (based all men only):" + myFormat.format(dMen));
}
}