String mit ENUM vergleichen?

kleinfritzchen

Aktives Mitglied
Hallo,
ich versuche aus einer Datei informationen für verschiedene Datentypen auszulesen. die TextDatei sieht folgendermasen aus:
Java:
SCHICHTEN
FREI=0
FRUEH=1
SPAET=2
NACHT=3

SCHICHTZYKLEN
Sandstrahler Team 2;20120910;;22330001122330001122333000110

END

Auslesen tue ich mit folgender Datei:
Java:
package Kalender01;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class LesenSchreiben {

	File f;
	FileReader fr;
	BufferedReader br;
	int trennerGesamt;
	String zeile, zyklus;
	int counter,zz=0;
	Liste schichten, schichtZyklen;

	LesenSchreiben(File f) {
		this.f = f;
		try {
			fr = new FileReader(f);
		} catch (FileNotFoundException e) {
			System.out.println("Fehler beim lesen der Datei!");
			e.printStackTrace();
		}
		br = new BufferedReader(fr);
		try {
			zeile = br.readLine();
			System.out.println(zeile);
		while (!zeile.equals(OOptionen.END.toString())) {
			if (zeile !=null && zeile.equals(OOptionen.SCHICHTEN.toString())){
				schichten=new Liste();
				zeile=br.readLine();
				System.out.println("hier 1");
				while (zeile != null){
					System.out.println("Schicht: "+zeile);
					zeile=br.readLine();
				}
				
			}else if (zeile !=null && zeile.equals(OOptionen.SCHICHTZYKLEN.toString())){
				schichtZyklen=new Liste();
				System.out.println("hier 2");
				while (zeile != null){
					System.out.println("Zyklus: "+zeile);
					zeile=br.readLine();
				}
			}
			
			System.out.println("durchlauf "+ zeile);	
			zeile=br.readLine();
		
		}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void arraySchicht() {

		// s=s.replaceAll(",","");
		// System.out.println(s);
		// String[] t=s.toString();//=char[s.length()];

		// t=s.toCharArray();
		System.out.println();
		int zähler = 0;
		// System.out.println(t.length);
		// for(String f:t){
		// System.out.print(f);
		// zähler++;
		// }
	}

	public String schichtZyklus() {
		String zeile;
		try {
			zeile = br.readLine();
			while (zeile != null) {
				// switch(
				System.out.println(zeile.lastIndexOf(';'));
				// System.out.println(zeile.substring(zeile.lastIndexOf(';')+1));
				zyklus = zeile.substring(zeile.lastIndexOf(';') + 1);
				zeile = br.readLine();
			}
		} catch (IOException e) {
			System.out.println("Lesefehler");
			e.printStackTrace();

		}
		return zyklus;
	}

	public static void main(String[] args) {
		LesenSchreiben test = new LesenSchreiben(new File(
				"G:/ec_Dateienn/EclipseWork/Eigener Kalender/src/Optionen.txt"));
		// test.schichtZyklus();
		test.arraySchicht();
	}
}
von bedeutung sind erst mal nur die Zeilen 31 bis 57. Ich hab es versucht über mehrere while-Schleifen die auswertung vorzunehmen, was aber nicht funktioniert und auch recht fehleranfällig ist (wennn in der Datei eine leerzeile zuviel oder zu wenig drin ist etwa)
In einem Enum (OOptionen) hab ich die Konstanten SCHICHT, SCHICHTZYKLUS, END hinterlegt.
In einer äußeren While schleife kann ich ja nach dem END als Abbruchkriterium suchen, möchte aber wenn er es nicht findet in der While Schleife gern über ein Switch die Konstanten abfragen und damit zu einem bestimmten Codebereich springen der mir die entsprechenden Element auswertet.

Benötigen tu ich z.B die namen der Schichten die möglich sind in einem Array mit dem ich dann eine JCombobox füllen kann. Oder Im Bezug von SCHICHTZYKLUS Elemente vom Typ Termin die eine Bezeichnung (String), ein Startdatum (DateTime), ein Enddatum [optional] und einen Schichtzyklus (String oder Char[]) enthält.
wie kann ich die Abfrage in einem Switch Statement angeben ? Geht das überhaupt?

MfG Fritz
 
wie kann ich die Abfrage in einem Switch Statement angeben ? Geht das überhaupt?
Ja, Du musst das Problem "von hinten" aufzäumen. Mit Zeilen wie der hier:
Java:
zeile.equals(OOptionen.SCHICHTZYKLEN.toString())){
Versuchst Du ja, die Enum-Konstante anhand des eingelesenen Strings zu matchen. Mache Dir die statische Methode valueOf(String) von Enums zu Nutze:
Java:
// Schmeißt eine IllegalArgumentException, wenn der String keiner Enum-Konstante
// zugeordnet werden kann
OOptionen zeilenOption = OOptionen.valueOf(zeile);

switch(zeilenOption) {

  case END:
   return;
  case SCHICHTEN:
   doSchichtenHandling();
   break;
  case SCHICHTZYKLEN:
   doSchichtzyklenHandling();
   break;
  default :
   // unbehandelte Enum-Konstante
   // logge es, implementiere default-Verhalten,
   // schmeiße Exception, was halt passt
}
Die statisce valueOf-Methode von Enums ist recht eingeschränkt. Sie findet nur Enum-Konstanten, wo der Name genau passt und schmeißt ansonsten eine IllegalArgumentException. Wenn Du da mehr brauchst (z.B. es soll auch eine Konstante gefunden werden, wenn deren Name in Kleinbuchstaben gegeben ist), implementiere Dir selbst eine Methode, die das abbildet. Ungefähr so:
Java:
public enum OOptionen {
  ENDE;

static private Map<String,OOptionen> BY_LOWERCASE_NAME = new HashMap<>(values().length);
static {
  for (OOPtion current : values()) {
     BY_LOWERCASE_NAME.put(current.name().toLowercase(), current);
  }
}

/**
   * Findet eine Enum-Konstante anhand ihres Namens.
   * Groß-/Kleinschreibung ist dabei egal.
   * Wenn name ungültig, wird null zurück gegeben, anstatt eine
   * Exception zu schmeißen
   */
public static OOptionen fromString(String name) {
   return BY_LOWER_CASE_NAME.get(name.toLowerCase());
}
 
Hallo,
ja, ich hab auch dran gedacht die Lösung mit valueOf(String) zu machen aber die Exception hat mich da abgeschreckt. deine Lösung ist recht gut nillehammer, hab zwar noch niicht alles verstanden aber ich denk drüber nach!
Ich hab derweil auch eine Lösung ganz ohne ENUMS gefunden (dank JAVA 1.7):
Java:
LesenSchreiben(File f) {
		this.f = f;
		try {
			fr = new FileReader(f);
		} catch (FileNotFoundException e) {
			System.out.println("Fehler beim lesen der Datei!");
			e.printStackTrace();
		}
		br = new BufferedReader(fr);
		try {
			zeile = br.readLine();
			System.out.println(zeile);
		while (!zeile.equals(OOptionen.END.name())) {
			switch(zeile){
			case "SCHICHTEN":{
				System.out.println(" Zeile Schicht");
				//auswertung bis zur nächsten Leerzeile
				break;
			}
			case "SCHICHTZYKLEN":{
				System.out.println(" Zeile Schichtzyklen");
				//auswertung bis zur nächsten Leerzeile
				break;
			}
			default:{
				System.out.println("keine treffer");
				/*dient nur zur sichtbarmachúng der zeilen,
				 * ansonsten braucht hier nichts zu passieren. 
				 */
			}
			}
			zeile=br.readLine();
		}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
auf diese weise kann ich leicht die Texte in der Optionen Datei besser lesbar machen.

MfG Fritz
 
Hallo,
jetzt geht das Problem weiter: wo mache ich hier den Feh´ler das er mir nicht die Leerzeile erkennt:
Java:
LesenSchreiben(File f) {
		this.f = f;
		try {
			fr = new FileReader(f);
		} catch (FileNotFoundException e) {
			System.out.println("Fehler beim lesen der Datei!");
			e.printStackTrace();
		}
		br = new BufferedReader(fr);
		try {
			zeile = br.readLine();
			System.out.println(zeile);
		while (!zeile.equals(OOptionen.END.name())) {
			switch(zeile){
			case "SCHICHTEN":{
				System.out.println(" Zeile Schicht");
				zeile=br.readLine();
				while(zeile !=null ){
					System.out.println("wert: "+zeile);
					zeile=br.readLine();
				}
				//auswertung bis zur nächsten Leerzeile
				break;
			}
			case "SCHICHTZYKLEN":{
				System.out.println(" Zeile Schichtzyklen");
				zeile=br.readLine();
				while(zeile!= null ){
					System.out.println("wert2: "+zeile);
					zeile=br.readLine();
				}
				//auswertung bis zur nächsten Leerzeile
				break;
			}
			default:{
				System.out.println("keine treffer");
				/*dient nur zur sichtbarmachzúng der zeilen,
				 * ansonsten braucht hier nichts zu passieren. 
				 */
				zeile=br.readLine();
			}
			}
			
		}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

er kommt nur in den ersten While Block im ersten case, dort läuft er über alle Zeile der Datei und kommt nicht aus dem While Block raus. Er erkennt also nicht die Leerzeile! Warum? ist mir ein Rätsel...
Kann es sein das die Variable "zeile" innerhalb des switch Blockes als lokale Variable gilt? ist doch eigentlich nicht möglich weil sie ja außerhalb der Methode deklariert wurde...
Rätsel...
 
Zuletzt bearbeitet:
Lösung gefunden!!!!
ich frage im Whilestatement nach der länge der zeile "zeile.length()!=0",
dann erkennt er mir die Leerzeile und beendet wie While schleife!
Java:
case "SCHICHTEN":{
				System.out.println(" Zeile Schicht");
				zeile=br.readLine();
				while(zeile.length() !=0){
					System.out.println("wert: "+zeile);
					zeile=br.readLine();
				}
				//auswertung bis zur nächsten Leerzeile
				break;
			}
 

Neue Themen


Zurück
Oben