# Textdatei auslesen und sortieren nach vorgebenen Kriterien



## Cranus (14. April 2010)

Erstmal ein herzliches Hallo. 

Nun aber zum Kern meiner Frage.

Ich habe folgende Aufgabe in der Schule erhalten.

Grundlage hierfür ist eine Textdatei, in der Artikeldaten enthalten sind. Jede Textzeile hat folgenden Aufbau:
Art.Nr.: 8 Zeichen
Art.Bez.:30 Zeichen
ME: 2 Zeichen
MaxBest.:4Zeichen
MinBest.:4Zeichen
Herst.:41 Zeichen
Preis:7Zeichen
MaxPreis:7Zeichen
MinPreis:7 Zeichen
Lieferzeit:2Zeichen
Zwischen den Angaben befindet sich jeweils ein trennendes Leerzeichen. Löse folgende Aufgabe durch ein Java-Projekt:

Es ist eine Artikelliste nach Bestandswerten (=Bestand * Preis) fallend sortiert auszugeben, die in der ME (Mengeneinheit) "QM" geliefert werden. Das Unterprogramm führe bei jedem Aufruf den Vergleich benachbarter Werte aus. Die Artikelbezeichnungen und die Mengeneinheiten(ME) sind mit aus zu geben, ebenso die prozentualen Abweichungen von den Max.- und Min.-Werten (bei Verwendund der Max.- bzw. Min.-Preisen).

Ein gesondertes Unterprogramm soll die Daten aus der Textdatei lesen und bereitstellen.

Seid etlichen Wochen knaupel ich nun an dem Programm rum, es will aber einfach nicht laufen.
So sieht bisher mein Quellcode aus:


```
package main;

import java.io.*;
import java.text.*;
import java.util.*;


public class main {

		ArrayList<String>ArtikelListe = new ArrayList<String>();
		static String Einzelartikel;
		int z =0;
		Einzelartikel = Einlesen(z);
		Artikel_Class Instanz = new Artikel_Class(Einzelartikel);
		if (Einzelartikel == "Fehler") System.out.println("Lesefehler");
		while (Einzelartikel != null)
		return null;
		{
			if(Instanz.Mengeneinheit == "QM");
			{
				ArtikelListe.add(Einzelartikel);
				z = z+1;
				Einzelartikel = Einlesen(z);
			}
		
			
				z = z+1;
				Einzelartikel = Einlesen(z);
			}
			if (Einzelartikel == "Fehler") System.exit(0);
			
			System.out.println(ArtikelListe);
			ArtikelListe = Bubblesort(ArtikelListe);
			System.out.println("Artikelbezeichnung  ME Bestand  Preis  Best.Wert  ProzAbweichung");
			System.out.println();
			System.out.println(ArtikelListe);
		}
		public static String Einlesen (int i)
		{	
		int pos = 126 * i;
		try
		{
			File FileDatei = new File("ARTIKEL.txt");
			FileReader FileReader = new FileReader(FileDatei);
			BufferedReader Reader = new BufferedReader(FileReader);
			Reader.skip(pos);
			Einzelartikel = Reader.readLine();
			System.out.checkError();
			Reader.close();
			return Einzelartikel;
		}
		catch (Exception Fehler)
		{
			System.out.println("Es trat folgender Fehler auf:" + Fehler);
			return "Fehler";
		}
				}
		public static ArrayList<String> BubbleSort(ArrayList<String> ArtikelListe)
		{
			int Zeilenanzahl = ArtikelListe.size() -1;
			String a, b;
			Double BW_a, BW_b;
			for (int i=0; i<Zeilenanzahl; i++)
			{
				for (int j=0; j<Zeilenanzahl; j++)
				{
					a = ArtikelListe.get(j);
					b = ArtikelListe.get(j+1);
					{
					}
				}
			}
                                                   return ArtikelListe;
		}
		}
```
 

___________________________________


```
package main;

public class Artikel_Class
{
	String Artikelbezeichnung, Hersteller, Mengeneinheit;
	int Artikelnummer, Bestand, Minimalbestand, Maximalbestand, Lieferzeit;
	public String Einzelartikel;
	public Artikel_Class(String Artikelzeile, double Preis, double Maximalpreis, double Minimalpreis, double Bestandswert, double MinBestandwert, double MaxBestandswert, Object ProzAbweichung, int MinBestandswert)
	{
		Artikelnummer=Integer.parseInt(Artikelzeile.substring(0,7));
		Artikelbezeichnung=Artikelzeile.substring(8,38);
		Mengeneinheit=Artikelzeile.substring(39,41);
		Bestand=Integer.parseInt(Artikelzeile.substring(42,46));
		Maximalbestand=Integer.parseInt(Artikelzeile.substring(47,51));
		Minimalbestand=Integer.parseInt(Artikelzeile.substring(52,56));
		Hersteller=Artikelzeile.substring(57,98);
		Preis = Double.parseDouble(Artikelzeile.substring(99,106));
		Maximalpreis = Double.parseDouble(Artikelzeile.substring(107,114));
		Minimalpreis = Double.parseDouble(Artikelzeile.substring(115,122));
		Lieferzeit=Integer.parseInt(Artikelzeile.substring(123,124));
	    Bestandswert = Preis*Bestand;
		MinBestandwert = Minimalbestand*Minimalpreis;
		MaxBestandswert = Maximalbestand*Maximalpreis;
		ProzAbweichung = (MinBestandswert*100)/MaxBestandswert;
	}
}
```

---------------------------------------------------------

Bitte helft mir, ich weiß mir keinen Rat mehr. 
Vielen Dank für euren schnellen Rat und Hinweis.


----------



## vfl_freak (14. April 2010)

Moin und Willkommen bei Tutorials.de !

zuerst ein Hinweis: nutze bitte die Code-Tags, damit Dein Code lesbar wird !
Du kannst dies entweder über den '#'-Button im Editor tun oder indem Du den Code händisch mit [_CODE_][_/CODE_] oder in diesem Fall
[_JAVA_][_/JAVA_] (jeweils ohne die Unterstriche klammerst 



> Seid etlichen Wochen knaupel ich nun an dem Programm rum, es will aber einfach nicht laufen.



Du solltest aber bitte auch schon beschreiben, was genau nicht funktioniert (resp. ggf. auch, was das Programm denn geplant tun soll) ... andernfalls wird schwierig Dir zu helfen!

Nix für ungut!
Gruß
Klaus


----------



## Cranus (14. April 2010)

Ich habe den Fehler nicht gefunden. Und was das Programm können soll, steht vor dem Code.

Im Grunde genommen liest das Programm die Datensätze aus der Textdatei und prüft ob der "QM" als Mengeneinheit vorhanden ist. Hiernach sortiert es fallend diese Datensätze und soll sie hiernach ausgeben.


----------



## vfl_freak (14. April 2010)

Moin,



Cranus hat gesagt.:


> Ich habe den Fehler nicht gefunden.


Schon klar, sonst hättest Du hier ja auch nicht gefragt 



Cranus hat gesagt.:


> Und was das Programm können soll, steht vor dem Code


Ich habe auch nicht das gesamte Programm, sondern das spezielle Fehlverhalten gemeint :suspekt:
Beschreibe doch einfach genau, wo was nicht so klappt, und wie Du es Dir an der Stelle ggf. vorstellst 

Gruß
Klaus


----------



## Cranus (14. April 2010)

ok mein Fehler. Dann hier nochmal auf eine hoffentlich bessere Art und Weise.

Also die Hauptaufgabe bei dem ganzen Projekt:

Grundlage hierfür ist eine Textdatei, in der Artikeldaten enthalten sind. Jede Textzeile hat folgenden Aufbau:
Art.Nr.: 8 Zeichen
Art.Bez.:30 Zeichen
ME: 2 Zeichen
MaxBest.:4Zeichen
MinBest.:4Zeichen
Herst.:41 Zeichen
Preis:7Zeichen
MaxPreis:7Zeichen
MinPreis:7 Zeichen
Lieferzeit:2Zeichen
Zwischen den Angaben befindet sich jeweils ein trennendes Leerzeichen.

besagte Textdatei:

```
51600226 Futtertuer TV-F14,5 9*20 R     ST 0684 0860 0150 Vereinigte Bauelementewerke Stralsund     1529.80 1595.80 1490.50 4
51700227 Blendrahmentuer TG2-B 9*20 L   ST 0012 0480 0080 Forstwirtschaftsbetrieb Waren             1859.20 1899.00 1595.00 3
51700228 Blendrahmentuer TG2-B 9*20 R   ST 0310 0480 0080 Forstwirtschaftsbetrieb Waren             1838.00 1899.00 1595.00 3
52100230 Likolit-Belag Extra            QM 0100 2000 0500 Linoleumwerke Kohlmuehle                  0038.15 0047.95 0038.15 5
52100231 Radeberger Treppenbelag        QM 0210 0800 0200 Bauproduktion Radeberg                    0029.55 0029.55 0028.95 1
52100232 Stahl-Pur-Bit-Dachelement      QM 1150 3000 0800 Holz- und Leichtmetallbauelemente Leipzig 0109.95 0119.00 0099.30 1
61100240 Brausekabine                   ST 0005 0080 0010 TGA Magdeburg                             0962.50 0983.45 0910.00 2
61100241 Praezisionsverdunkl.-Anl.15*20 ST 0007 0160 0040 Licht- und Sonnenschutzanl. Friedrichroda 0316.60 0333.20 0316.60 5
```

 Löse folgende Aufgabe durch ein Java-Projekt:

Es ist eine Artikelliste nach Bestandswerten (=Bestand * Preis) fallend sortiert auszugeben, die in der ME (Mengeneinheit) "QM" geliefert werden. Das Unterprogramm führe bei jedem Aufruf den Vergleich benachbarter Werte aus. Die Artikelbezeichnungen und die Mengeneinheiten(ME) sind mit aus zu geben, ebenso die prozentualen Abweichungen von den Max.- und Min.-Werten (bei Verwendund der Max.- bzw. Min.-Preisen).

Ein gesondertes Unterprogramm soll die Daten aus der Textdatei lesen und bereitstellen.



```
package main;

import java.io.*;
import java.text.*;
import java.util.*;


public class main
{

		///**
		 //* @param args
		 //*/
		public static void main(String[] args)
		{
			/** Das Programm liest alle Artikel mit Mengenangabe QM aus,
			 *  berechnet den Bestandswert und Prozentuale Abweichungen und 
			 *  sortiert fallend nach Bestandswerten mit dem Vergleich benachbarter Werte
			 */
			ArrayList<String> ArtikelListe = new ArrayList<String>(); //ArrayListe fŸr DatensŠtze
			String Einzelartikel;
			int z =0;
			
			//DecimalFormat uf = new DecimalFormat( "##,##0.00" );		// Formatierung für die Ausgabe, DiffEuro
			//DecimalFormat zf = new DecimalFormat( "#0.00");				// DiffProz
			DecimalFormat df = new DecimalFormat( "####0.00" );			// Formatierung
			//DecimalFormatSymbols ds = new DecimalFormatSymbols();
			
			Einzelartikel = Einlesen(z);	//erster Aufruf UP Einlesen (vor der Schleife)
			System.out.println(Einzelartikel);
			if (Einzelartikel == "Fehler") System.out.println("Lesefehler");	//Fehlerausgabe
					
			while (Einzelartikel!= null)		//Beginn EndgeprŸfte while-Schleife
			{
				Artikel_Class Instanz = new Artikel_Class(Einzelartikel);	//Erzeugung neue Instanz der Klasse 
																			//Artikel_Class und †bergabe des Inhalts
																			//von String Einzelartikel	
				//Einzelartikel = Instanz.Einzelartikel;	//†bernahme String Einzelartikel aus der Instanz
			
				//System.out.println(Instanz.Artikelnummer);
				//System.out.println(Instanz.Artikelbezeichnung);
				//System.out.println(Instanz.Mengeneinheit);
				//System.out.println(Instanz.Bestand);
				//System.out.println(Instanz.Maximalbestand);
				//System.out.println(Instanz.Minimalbestand);
				//System.out.println(Instanz.Hersteller);
				//System.out.println(Instanz.Preis);
				//System.out.println(Instanz.Maximalpreis);
				//System.out.println(Instanz.Minimalpreis);
				//System.out.println(Instanz.Lieferzeit);
				System.out.println(Instanz.Bestandswert);
				
				
				if (Instanz.Mengeneinheit == "QM")
				{
				//Einzelartikel = Einzelartikel+Instanz.Bestandswert+Instanz.ProzAbweichung;
				
					
					Einzelartikel = Instanz.Artikelbezeichnung + " " + Instanz.Mengeneinheit + " " + Instanz.Bestand + " " + Instanz.Preis + " " + df.format(Instanz.Bestandswert) + " " + df.format(Instanz.ProzAbweichung);
					
					ArtikelListe.add(Einzelartikel);	//in die ArtikelListe aufnehmen
					z = z+1;	//Zähler erhöhen		
					Einzelartikel = Einlesen(z);	//UP Einlesen aufrufen
				}
				else
				{
					z = z+1;	//Zähler erhšhen		
					Einzelartikel = Einlesen(z);	//UP Einlesen aufrufen
				}

				System.out.println(Einzelartikel);				
				if (Einzelartikel == "Fehler") System.exit(0);	//falls UP Fehler zurückgibt, Abbruch Programm		
			}
			System.out.println(ArtikelListe);
			
			ArtikelListe = BubbleSort(ArtikelListe);	//UP Bubblesort sortiert ArtikelListe nach Bestandswerten
			
			System.out.println("Artikelbezeichnung    ME  Bestand   Preis   Best.Wert   Proz.Abweichung");
			System.out.println();
			System.out.println(ArtikelListe);
					
		}
		
		public static String Einlesen(int i)	//UP Einlesen wird gestartet
		{
			int pos = 126 * i;	//Deklaration & Initialisierung der Positionierungsvariable
			
			String Einzelartikel;	
			try
			{
					File Datei = new File("ARTIKEL.txt");	//lesen der einzelnen Datensätze unter 
					FileReader FileReader = new FileReader(Datei);	//Verwendung der try-catch Anweisung 
					BufferedReader Reader = new BufferedReader(FileReader);	//(Exception-Handling)
					
					Reader.skip(pos);	//Positionierung auf nŠchstem Datensatz
					Einzelartikel = Reader.readLine();	//Datensatz wird gelesen
					
					System.out.checkError();
					Reader.close();	//Lesepuffer wird geschlossen
					
					return Einzelartikel;	//zurück zum rufendem Programm mit Datensatz
											//wenn kein Datensatz mehr, dann gibt >null< zurück
			}
			catch(Exception Fehler)
			{
				System.out.println("Es trat folgender Fehler auf: " + Fehler);	//weitere Fehlerbehandlung erfolgt im HP
				return "Fehler";
			}
		}
		
		
		public static ArrayList<String> BubbleSort(ArrayList<String> ArtikelListe)
		{
			int Zeilenanzahl = ArtikelListe.size() -1;	//Bestimmt die anzahl der DatensŠtze in der Liste
			
			String String_A, String_B;	//Deklarieren der nštigen Variablen
			Double BestWert_A, BestWert_B;
			
			//DecimalFormat uf = new DecimalFormat( "##,##0.00" );		// Formatierung für die Ausgabe, DiffEuro
			//DecimalFormat zf = new DecimalFormat( "#0.00");				// DiffProz
			
			
			for (int i=0; i < Zeilenanzahl; i++)
			{
				for (int j=0; j < Zeilenanzahl; j++)
				{
					String_A = ArtikelListe.get(j);	//zu vergleichende String aus der Liste entnehmen
					String_B = ArtikelListe.get(j+1);
					
					BestWert_A = Double.parseDouble(String_A.substring(44,52));	//Bestandswert aus Strings auslesen
					BestWert_B = Double.parseDouble(String_B.substring(44,52));
					
					if (BestWert_B < BestWert_A)	//Ist Bestandswert B kleiner als A?
					{
						ArtikelListe.set(j+1, String_A);	//dann vertausche Datensätze
						ArtikelListe.set(j, String_B);
					}
				}
			}
				return ArtikelListe;	//fallend sortierte ArtikelListe zurück an HP
		}
	}
```

Dazu habe ich die Artikel_Class programmiert, in der die Positionierung und Formatierung der einzelnen Strings festgelegt wird.


```
package prüfung_info_42;

import java.text.*;

public class Artikel_Class	//KLasse wird deklariert
{
	//Klassenvariablen werden deklariert (Bestandteile von ARTIKEL.txt)
	String Artikelbezeichnung, Hersteller, Mengeneinheit;
	int Artikelnummer, Bestand, Minimalbestand, Maximalbestand, Lieferzeit;
	double Preis, Maximalpreis, Minimalpreis, Bestandswert, MinBestandswert, MaxBestandswert, ProzAbweichung;
	public String Einzelartikel;	//Einzelartikel als String definiert
	
	DecimalFormat df = new DecimalFormat( "####0.00" );			// Formatierung
	DecimalFormatSymbols ds = new DecimalFormatSymbols();
	
	//Anfang Konstruktor
	
	
	public  Artikel_Class(String Artikelzeile)
	{
 		Artikelnummer=Integer.parseInt(Artikelzeile.substring(0,8));
 		Artikelbezeichnung=Artikelzeile.substring(9,39);
 		Mengeneinheit=Artikelzeile.substring(40,42);
 		Bestand=Integer.parseInt(Artikelzeile.substring(43,47));
 		Maximalbestand  = Integer.parseInt(Artikelzeile.substring(48,52));
 		Minimalbestand = Integer.parseInt(Artikelzeile.substring(53,57));
 		Hersteller= Artikelzeile.substring(58,98);
 		Preis= Double.parseDouble(Artikelzeile.substring(99,107));
 		Maximalpreis= Double.parseDouble(Artikelzeile.substring(108,114));
 		Minimalpreis= Double.parseDouble(Artikelzeile.substring(115,123));
 		Lieferzeit = Integer.parseInt(Artikelzeile.substring(124, 125));
		
 		ds.setDecimalSeparator('.');								// Setzt Dezimaltrennzeichen auf '.'
 		df.setDecimalFormatSymbols(ds);								// notwenig für Konvertierung String -> Double

 		//Umsatz = Math.round(Preis * Stck * 100) / 100.;
 		//Einzelartikel = df.format(Umsatz) + " " + Anr + " " + Abez;			
 		
 		
 		
 		Bestandswert = Math.round(Preis * Bestand);
 		MinBestandswert = Minimalbestand * Minimalpreis;
 		MaxBestandswert = Maximalbestand * Maximalpreis;
 		ProzAbweichung = Math.round(MinBestandswert * 100) / MaxBestandswert;
 		Einzelartikel = Artikelbezeichnung + " " + Mengeneinheit + " " + Bestand + " " + Preis + " " + df.format(Bestandswert) + " " + ProzAbweichung;
		
	}	
}
```

Zum einen liest er zwar die TXT Datei aus, gibt aber entweder alle Datensätze aus, keinen, oder er nimmt immer 1 Zeichen beim nächsten String weg, sprich Datensatz 2 hat 1 Zeichen weniger, usw.

Was es nun tun soll; es soll die TXT Datei nach allen Datensätzen durchsuchen, also er überprüft alle Datensätze, und soll im Endeffekt nur die Datensätze ausgeben, deren Mengeneinheit "QM" ist.


----------



## Vereth (14. April 2010)

Strings vergleicht man nicht mit dem Operator == , sondern mit der _equals_-Methode.
Wenn du schon eine Artikel-Klasse hast, dann solltest du die _ArrayList_ auch vom Typ _Artikel_Class_ machen.
Für den Vergleich von zwei _Artikel_Class_-Objekten ist es besser, wenn du das Interface _Comparable_ implementierst. Mit Hilfer der _compareTo_-Methode kannst du dann in deiner Bubblesort-Methode direkt zwei Objekte miteinander vergleichen, welche die Bestandswerte als double-Zahlen vergleichen.
Für die Ausgabe als String solltest du in deiner Klasse die toString()-Methode überschreiben und bei der Ausgabe aufrufen.
Für das Vertauschen brauchst du eine Zwischenvariable, sonst überschreibst du einen Wert.
Du brauchst die Artikelliste nicht als Funktionswert zurückzugeben, weil Bubblesort in-place arbeitet, d.h. die übergebene ArrayList verändert.
Die Schleifenzähler in deiner Bubblesort-Funktion werden falsch durchlaufen. Richtig ist:


```
public static void BubbleSort(ArrayList<Artikel_Class> ArtikelListe)
{
    Artikel_Class tmp;
    int Zeilenanzahl = ArtikelListe.size() -1;
    for (int i=Zeilenanzahl-1; i > 0; i--)
    {
        for (int j=0; j < i; j++)
        {
            if ( ArtikelListe.get(j).compareTo(ArtikelListe.get(j+1)) != -1 )
            { continue; }
            tmp = ArtikelListe.get(j);
            ArtikelListe.set(j    , ArtikelListe.get(j+1));
            ArtikelListe.set(j+1, tmp);
        }
    }
}
```


----------

