# Vergleichen von Text & Datum



## D34DL1NES (26. Mai 2009)

Hallo, ich bin ein absoluter Java neuling und leider spiegelt sich das auch in meinen Ergebnisse wieder 

Nun zu meinem Problem:
Ich muss eine Funtion schreiben, die Text aus einer txt-file mit eingegebenen Text vergleicht, dabei muss auch ein Datums-wert verglichen werden. Wenn ein 100% übereinstimmendes Ergebnis gefunden wurde soll dieses letztendlich ausgegeben werden. Ich poste hier einfach mal den bisherigen code, dann ist es sicherlich leichter naczuvollziehn.


```
/*
 * EventFilter.java
 *
 * Created on 7. Mai 2009, 08:29
 *
 */

package weitblickdemo;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.text.SimpleDateFormat;
import java.util.*;

import javax.swing.JOptionPane;

public class EventFilter implements IEventConsts{
    
    private static final String String = null;
	private HashSet<String> curLocations;
    private HashSet<String> curEvents;
    private Calendar startDate;
    private Calendar endDate;
    
    /** Creates a new instance of EventFilter */
    public EventFilter() {
        //Inititalisierung
        curLocations = new HashSet<String>();
        curEvents = new HashSet<String>();
        loadData();
    }
    
    public synchronized boolean addLocation (String location) {
        
        return curLocations.add(location);
    }
    
    public synchronized boolean removeLocation (String location) {
        return curLocations.remove(location);
    }
    
    public synchronized boolean clearLocations() {
        curLocations.clear();
        return true;
    }
    
    public synchronized boolean addEvent (String event) {
        return curEvents.add(event);
    }
    
    public synchronized boolean removeEvent (String event) {
        return curEvents.remove(event);
    }
    
    public synchronized boolean clearEvents () {
        curEvents.clear();
        return true;
    }
    
    public void setStartDate(Calendar startDate) {
        System.err.println(startDate.getTime()); //.
        this.startDate = startDate;
    }
    
    public Calendar getStartDate() {
        return startDate;
    }
    
    public void setEndDate(Calendar endDate) {
        System.err.println(endDate.getTime());
        this.endDate = endDate;
    }
    
    public Calendar getEndDate() {
        return endDate;
}

    @SuppressWarnings("null")
	public String getFilteredEvents() {  
    	int i=0;
    	int j=0;
    	int z=0;
    	char sort[] = null;
    	char sdatum[] = null;
    	char styp[] = null;
    	char sname[] = null;
    	
    	try {
    		BufferedReader in = new BufferedReader(new FileReader("daten.txt"));
    		String zeile = null;
    		while ((zeile = in.readLine()) != null) {			
    			char zeichen[] = zeile.toCharArray ();
    			if(zeichen[i]==' ')
    				z++;
    			if(z==0) {
    				sort[j]=zeichen[i];
    			}
    			if(z==1)
    				sdatum[j]=zeichen[i];
    			if(z==2)
    				styp[j]=zeichen[i];
    			if(z==3)
    				sname[j]=zeichen[i];
    			if(zeichen[i]=='\n') {
					if(curLocations.contains(sort)==true && /*sdatum==date &&*/ curEvents.contains(styp)==true) {
						//tostring - ausgabe? return?
    					z=0;
    					j=-1;
    					i=-1;
    					}
    				}
    				i++;
    				j++;
    			}
    	}
    			
    		catch (IOException e) {
    		e.printStackTrace();
    	}	
        return null;
    }
    
	private void loadData() {
        //TODO!
    }
}
```

Ich weiß die Art wir ich auslese und vergleiche ist sicherlich sehr komisch, aber ich habe auf die schnelle nichts besseres hinbekommen (auch lass ich mir da gerne helfen). Im endeffekt geht es um die Funktion getFilteredEvents().

Wie kann ich vlt einen besseren Vergleich von Text machen (sowas wie strcmp)?
Wie kann ich die File effektiver auslesen, anstatt erst eine Zeile in Buchstaben zu splitten um die dann in arrays zu speichern?
Die Inputfile sieht so aus:

```
Arnstadt 06/32/2009 lesung Diashow
Ilmenau 06/32/2009 sport Schwimmbad
Stützerbach 06/27/2009 kino Film
Manebach 06/17/2009 markt Fischmarkt
```

Wie verhält sich das ganze mit den Calendar objekten, wie kann ich feststellen ob mein angegebenes Datum auch mit dem in der Datei übereinstimmt, wie kann ich calendar-daten zu einem string kovertieren?

Viele Fragen und ich hoffe auf nützliche Antworten, Danke schon einmal dafür!

Anhang: restlichen teile die zum programm gehören falls benötigt.


----------



## LSd (26. Mai 2009)

Guten Morgen,
viel. hilft dir folgendes weiter:

haben im Gundkurs Java ein kleines Programm geschrieben zur Datumsanalyse und dergleichen. Soll jetzt nicht weiter interessieren. Das Datum stand allerdings im selben Format zur Verfügung.

Der Zugriff erfolgte über:


```
String [] date = args[0].split("\\.");
	
int day = Integer.valueOf(date[0]).intValue();
...
```

Wenn du also die gesamte Zeile hast könntest du sie teilen durch Leerzeichen als Trenner. Daraufhin weisst du, dass im Arrayelement 1 (von 0 gezählt) sich dein Datum befindet, welches du wiederum mit "/" als Trennzeichen zerlegst.

Grüße


----------



## hammet (26. Mai 2009)

Hast du dir mal das SimpleDateFormat angeschaut? Damit kannst du nach belieben mit Dates und Strings arbeiten.

Und wieso liest du überhaupt jedes Zeichen einzeln ein?


----------



## D34DL1NES (26. Mai 2009)

Danke ersteinmal lsd, sowas hatte ich schon einmal irgendwo gelesen, ich werde mal versuchen es iwie zum laufen zu bekommen.

@hammet: hast du vlt ein konkretes code beispiel damit ich das besser nachvollzien kann?
zu der frage warum ich alles einzeln einlese kann ich nur sagen dass ich keine bessere möglichkeit wusste wie ich jedes einzelne wort in ein eigenes array speichere (so etwas wie wortweise einlesen habe ich nicht gefunden) . eine möglichkeit wäre wohl noch gewesen eine list zu erstellen, aber da weis ich erst recht nicht wie ich vorgehen muss... wenn du eine bessere lösung hast lass es mich bitte wissen


----------



## hammet (26. Mai 2009)

Also du liest immer Zeilenweise ein und teilst den eingelesenen String dann mittels "split".

```
...
String[] arr = zeile.split(" ");
...
```

So hast du jede Zeile schön nach einen Leerzeichen getrennt in einem Array abgespeichert und kannst gegebenenfalls ausserhalb der Leseschleife den Arrayinhalt nach Spalte sortieren (oder was auch immer du am liebsten magst).

Mit hilfe des SimpleDateFormates kannst du einen String in ein Date parsen oder ein Date in einen String.

Date zu String:

```
...
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
String datum = sdf.format(new Date());
...
```
Beim Konstruktor des SimpleDateFormat gibst du dann einfach deinen pattern an.

String zu Date:

```
...
	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	
	Date datum;
	
	try {
		
		datum = sdf.parse("31/05/2009");

	} catch (ParseException e) {

		e.printStackTrace();
		
	}
...
```
Auch hier musst du im Konstruktor den richtigen Pattern angeben.

Zum Ändern des Patterns des SimpleDateFormat hilf dir die Methode "applyPattern".

Vergleichen kannst du die Dates dann entweder anhand des Strings (alle in ein Format bringen und dann mittels "equals" vergleichen) oder anhand der Long-Werte des zugehörigen Dates.

Ein Blick in die Api ist vieleicht auch von Vorteil.
http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html


----------



## D34DL1NES (27. Mai 2009)

Vielen Dank erst einmal!

Ich habe das einlesen jetzt allerdings doch so gelöst:

```
try {
    		BufferedReader in = new BufferedReader(new FileReader("daten.txt"));
    		String zeile = null;
    		while ((zeile = in.readLine()) != null) {			

    				String[] parts = zeile.split(" ");
    				String ort = parts[0];
    				String datum[] = parts[1].split(".");
    				String typ = parts[2];
    				String name = parts[3];
    				Calendar cal = Calendar.getInstance();
    				cal.set(Integer.parseInt(datum[2]), Integer.parseInt(datum[1]), Integer.parseInt(datum[0]), 0, 0);
    				if(curLocations.contains(ort)==true && curEvents.contains(typ)==true && ? );
    				//ausgabe
    			} 
    	}
    			
    		catch (IOException e) {
    		e.printStackTrace();
    	}
```

ich habe dann versucht das datum zu parsen, doch komme dann bei dem vergleich nicht wirklich weiter, da habe ich gerade eine blockade. vielleicht kann mir jemand helfen :/


----------

