Einen Vector/Liste mit Daten prüfen

Status
Nicht offen für weitere Antworten.

babel

Aktives Mitglied
So Hallo Freunde der Sohne 😀 ich stehe da vor einem Rätsel... und zwar hab ich einen Vector mit verschiedenen Daten und was ich halt prüfen will ist ob z. B für das Jahr 2006 die Kontogebühren bezahlt worden sind, wenn nicht? dann sollen Kontogebühren verbucht werden. Ich habe mir da Gedanken gemacht und zwar hab ich ja einen weiteren Vector mit Strings gefüllt und zwar wer die Buchungen durchgeführt hat und im Grunde muss ich ja vergleichen oder nicht? also wenn 31.12. und Gebucht: Kontogebühren dann wurden die bezahlt aber ich weiss leider nicht wie ich die ganzen Daten trennen kann ^^ könnte mir da jemand einen Tipp geben?
 
ja es sind halt viele Daten(Datum) 😀 und zwar z. B. 06.06.2006, 31.12.2006, 13.07.2007,
31.12.2007 usw und ja sie sind als Strings gespeichert
 
ja parsen ist mir irgendwo klar aber hmm mir ist halt nicht so ganz klar wie ich die Prüfung durchführen soll und zwar ob für das Jahr 2006 Kontogebühren verbucht wurden oder nicht.
 
1. Du solltest statt Vector eine ArrayList als Implementation von List (bzw. Collection) verwenden, ist (neuer und) schneller
2. Für deinen Fall eignet sich aber eher ein Set (bzw. die Implementation HashSet), da kannst du mit set.contains(<T>) überprüfen, ob sich etwas darin befindet und solltest eine Laufzeit von O(1) haben. Bei einer List müsstest du mit einer Schleife drüber, was einem worst Case von O(n) entspricht.
 
Datum
01.04.2009
01.07.2009
01.10.2009
29.12.2009
31.12.2009
31.12.2009
31.12.2009
16.05.2010

Buchungshinweis
Eugen Loskan
Bank
Eugen Loskan
Bank
Eugen Loskan
Kontogebuehren
Zinsen
Eugen Loskan

und zwar sehen die Daten so aus die werden in 2 vectoren gespeichert die aus einer access datenbank geladen werden. z. B. gebucht am 01.04.2009 von Eugen Loskan
 
Ups, da hab ich mir ein Bisschen zu wenig Gedanken gemacht. Aber wenn du das Datum auf Jahr/Monat/Tag splittest, und Map<String, Map<String, Set<String>>> verwenden würdest, könntest du in etwa folgender Code verwenden (1. Map für die Jahre, 2. für die Monate, 3. für die Tage):
Java:
if (map.contains(year) && map.get(year).contains(month) && map.get(year).get(month).contains(day)) { ... }

Edit: für deine Buchungsdetails kannst du natürlich als dritten Datentyp statt Set<String> Map<String, String> verwenden und den Comment als Value speichern.
 
also ganz kurz 😀 das parsen in ein Datum ist ja kein Problem ich weiss nur irgendwie fühl ich mich bissle überfordert ich weiss einfach nicht wie ich am besten dann vergleichen soll also die Daten sind ja schon sortiert nach Datum muss jetzt nur wie ich schon sagte prüfen ob die Kontogebühren für dieses Jahr bezahlt wurden oder nicht und dann ab zum nächsten Jahr usw.
 
Dann suche eben einfach nach der Jahreszahl.

Java:
if (aktuellerString.contain(jahresZahl)) {...}
 
okay das sieht schonmal gut aus 😀 ich mach mich dann ans werk thx für den vorschlag ^^
 
Die Version von faetzminator ist schon gut.

Dann kannst du alle Buchungen von einem Jahr aus der ersten Map/Set holen.
Danach holst du alle Buchungen von einem Monat aus der Jahresmap.
Danach holst du die entsprechende Buchung aus der Monatsmap.

Das sieht, ein wenig schematisch dargstellt, so aus:

Code:
HashMap Jahre <
   Key: Jahr,
   Value: HashMap Monate <
      Key: Monat,
      Value: HashMap Buchungen <
         Key: BuchungsText,
         Value: VollesDatum / Tag
      >
   >
>

Dann kanst du das (ist jezt unschoen programmiert) so ueberpruefen, ob die Buchung existiert:
Java:
boolean existiert=true;

try {
  Jahre.get("2008").get("02").get("Zinsen");
} catch (NullPointerException npe) {
  //Log.error(npe)
  existiert=false;
}

if (existiert)
  //Log.log("Ich wuensche einen schoenen Abend");
else
  //Log.warning("Trozdem einen schoenen Abend");

Sonnst musst du durch alle Keys gehen um den entsprechenden Zeitraum zu waehlen.

~Chris
 
Zuletzt bearbeitet:
Aber so richtig wohl fühle ich mich dabei nicht! 🙁

Im Prinzip waere das auch eine Aufgabe fuer die (Access) Datenbank, und nicht etwas, das mit Java geloest werden sollte.
Das ganze funktiert aber nach einem Tiefensuchalgorythmus, ist also recht effizient. (Nachteil: Der "Index", also das HashMap-Konstrukt, muss zuerst aufgebaut werden.)

~Chris
 
Zuletzt bearbeitet:
ich hab mir das so gedacht das ich einfach die abfrage verschachtele also wenn ich nach dem vorschlag von Leroy42 vorgehe und zwar frag ich erstmal ab ob das jahr zutrifft dann natürlich nach dem 31.12 und ob unter diesem Datum dann die Kontogebühren exestieren, wenn nicht, dann soll eine Transaktion durchgeführt werden 😀 oder so halt muss halt gucken ^^ aso ja wegen dieser sache mit access die Kontogebühren sowie Zinsen tauchen dort garnicht auf... es sind nur normale Buchungen gespeichert die zwischen dem 01.01. und 31.12 getätigt worden sind und dann kommen erst die Zinsen und Kontogebühren am 31.12!
 
Zuletzt bearbeitet:
@Babel: Dann kannst du aber gleich nach dem 31.12 suchen:
Java:
for (alle Datum/Buchung kombinationen) {
  if (aktuellesDatumAlsString.contains("31.12")) {
    if ( !aktuelleBuchungAlsString.matches("Kontogebuehr") {  //Das ! nicht uebersehen!!!
      String jahrInDemDieBuchungVergessenWurde = aktuellesDatumAlsString.substring(5,9);
    }
  }
}

~Chris
 
cimnine, aber ein Datentyp mit Hashing und die Verwendung von contains() ist wie bereits erwähnt viel schneller.
Und bei meinem Lösungsansatz gehe ich davon aus, dass man je nach dem Einträge auf ein gewisses Jahr sucht, oder auf einen gewissen Monat in einem Jahr etc... Sozusagen verwendet man nur, was man gerade braucht. Wie oft und wann werden die Daten denn eingefüllt, wie werden sie gespeichert?
 
ich hab mir das so gedacht das ich einfach die abfrage verschachtele also wenn ich nach dem vorschlag von Leroy42 vorgehe und zwar frag ich erstmal ab ob das jahr zutrifft dann natürlich nach dem 31.12 und ob unter diesem Datum dann die Kontogebühren exestieren, wenn nicht, dann soll eine Transaktion durchgeführt werden 😀 oder so halt muss halt gucken ^^ aso ja wegen dieser sache mit access die Kontogebühren sowie Zinsen tauchen dort garnicht auf... es sind nur normale Buchungen gespeichert die zwischen dem 01.01. und 31.12 getätigt worden sind und dann kommen erst die Zinsen und Kontogebühren am 31.12!
Du solltest evtl mal die Struktur Deiner Datenbank schicken. Dann kann man weitersehen.
Was wird denn dort eigentlich notiert?
Wenn man weiß, welche Daten vorliegen, kann man helfen, wie man Dein Problem lösen kann.

Hanns
 
und zwar sehen die Daten so aus:

c38c1583.jpg
 
alles scharrn ;-)

sorry aber das hat nix mit objektorientierter programmierung zu tun...

zuerste erstellen wir uns mal ein Fachobjekt, irgendwelche liste mit datum, und listen mit strings... alles müll

Java:
import java.util.Date;


public class Buchung {
   
   private int id;
   private Date datum;
   private float betrag;
   private String buchungshinweis;
   
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   public Date getDatum() {
      return datum;
   }
   public void setDatum(Date datum) {
      this.datum = datum;
   }
   public float getBetrag() {
      return betrag;
   }
   public void setBetrag(float betrag) {
      this.betrag = betrag;
   }
   public String getBuchungshinweis() {
      return buchungshinweis;
   }
   public void setBuchungshinweis(String buchungshinweis) {
      this.buchungshinweis = buchungshinweis;
   }
   
}
 
also ganz ehrlich? ich speichere die daten schon in einem Objekt und so sieht es bei mir aus... und den comparator brauch ich um nach Datum zu sortieren.

[HIGHLIGHT="Java"]
public class TransaktionsDaten implements Comparator<TransaktionsDaten>{

private int id;
private Date datum;
private double betrag;
private String gebuchtvon;

public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id +1;
}

public Date getDatum()
{
return datum;
}
public void setDatum(Date datum)
{
this.datum = datum;
}
public double getTransaktionsBetrag()
{
return betrag;
}
public void setTransaktionsBetrag(double betrag)
{
this.betrag = betrag;
}
public String getTransaktionGebuchtVon()
{
return gebuchtvon;
}
public void setTransaktionGebuchtVon(String gebuchtvon)
{
this.gebuchtvon = gebuchtvon;
}

@Override
public int compare(TransaktionsDaten arg0, TransaktionsDaten arg1) {
// TODO Auto-generated method stub
return 0;
}
}
[/HIGHLIGHT]
 
Zuletzt bearbeitet:
und dann kann man in irgendeiner Fachklasse die logic verarbeiten...

Java:
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;


public class IrgendeineControllerKlasse {
   
   public static void main(String[] args) {
      List<Buchung> buchungen = new ArrayList<Buchung>();
      //Buchungen parsen...
      
      
      List<Buchung> buchungenMitKontoGebebuehren = getBuchungenMitKontogebuehren(buchungen, 2009);
    }
   
   public static List<Buchung> getBuchungenMitKontogebuehren(List<Buchung> buchungen, int jahr){
      List<Buchung> result = new ArrayList<Buchung>();
      
      GregorianCalendar cal =new GregorianCalendar();
      
      for(Buchung b: buchungen){
         cal.setTime(b.getDatum());
         if((cal.get(Calendar.YEAR)==jahr) && (cal.get(Calendar.MONTH)== Calendar.DECEMBER)
               && (cal.get(Calendar.DAY_OF_MONTH) ==31)){ //nur die für das jahr und vom 31.12
            if(b.getBuchungshinweis().contains("Kontogebuehren"))
               result.add(b);            
         }
      }
      
      
      return result;
      
   }

}
 
Man kann in eine Klasse einen Parser auslagern der dir eine Liste von Buchungen aus einer CSV, Access oder Datenbank ließt/schreibt... was man halt braucht...
 
Natürlich ist diese Möglichkeit sicherlich schöner bzw. "objektorientierter" - wenn man sich allerdings wegen grossen Datenmengen und verschiedenen Abfragetypen um die Geschwindigkeit Gedanken machen muss, ist die Lösung mit Laufzeit O(~1) schöner als die aktuell vorgeschlagene mit O(n).
 
so ich habe bis jetzt noch einen anderen Weg verfolgt, der leider misglückte und jetzt zu deiner Geschichte ich muss ja am Anfang die Daten(Datum) parsen und dann als ein Objekt in der Liste abspeichern. Aber irgendwie wenn ich das Format "yyyy" bestimme, wird zwar geteilt aber falsch... der teilt mir von anfang z. B. 16.06.2007 dann wäre für ihn das Jahr 2016 und nicht 2007 und so sieht es bei mir bis jetzt aus:

[HIGHLIGHT="Java"]
public void pruefeKontogebuehren()
{
List<TransaktionsDaten> buchungen = new ArrayList<TransaktionsDaten>();
SimpleDateFormat format3 = new SimpleDateFormat("dd.MM.yyyy");
String jahresabschluss = "31.12.";
Date date1;
String jahresdatumgeteilt = "";

TransaktionsDaten trans = new TransaktionsDaten();

for(int i = 0; i < postbank.getVectorDaten().size(); i++)
{
try{
date1 = format3.parse((String) postbank.getVectorDaten().get(i));
jahresdatumgeteilt = format.format(date1);

System.out.println("Jahr: " + jahresdatumgeteilt);

// vectorjahresdaten.add(jahresabschluss + jahresdatumgeteilt);
// vectorjahresjahre.add(jahresdatumgeteilt);

System.out.println("ICH bin ein Datum: " + date1);

trans.setDatum(date1);

}catch(ParseException ex2){
}
}
List<TransaktionsDaten> buchungenMitKontoGebuehren = getBuchungenMitKontogebuehren(buchungen, 2009);
}
[/HIGHLIGHT]
 
so ich stehe vor einem kleinem Problem was mich klein erscheinen lässt 😀 und zwar ist das Problem, dass wenn ich nach dem parsen den Funktionsaufruf: getBuchungenMitKontogebuehren(buchungen, jahr); aufrufe funktioniert zwar alles schön nur da wird der letzte Wert genommen die anderen werden alle vom neuem Wert überschrieben und wenn ich in der Schleife(try und catch block) diese Funktion einbaue dann prüft der mir 1x nach einem durchlauf nach dem 2. durchlauf 2x usw. ich seh einfach den fehler nicht ...

[HIGHLIGHT="Java"]

public void pruefeKontogebuehren()
{
vectorjahresdaten.clear();
vectorjahresjahre.clear();
List<TransaktionsDaten> buchungen = new ArrayList<TransaktionsDaten>();
SimpleDateFormat format3 = new SimpleDateFormat("dd.MM.yyyy");
Date date1;
Date date2;
int differenz = 0;
int kleinstesjahr = 0;
int groesstesjahr = 0;
String jahresdatumgeteilt = "";
String wurdegebucht = "";
int jahr = 0;

TransaktionsDaten trans = new TransaktionsDaten();

for(int i = 0; i < postbank.getVectorDaten().size(); i++)
{
try{
date1 = format3.parse((String) postbank.getVectorDaten().get(i));
date2 = format3.parse((String) postbank.getVectorDaten().get(i));
jahresdatumgeteilt = format.format(date1);
jahr = Integer.parseInt(jahresdatumgeteilt);

vectorjahresdaten.add(date2.toString());
vectorjahresjahre.add(jahr);

trans.setDatum(date1);
wurdegebucht = (String) postbank.getVectorgebuchtvon().get(i);
trans.setTransaktionGebuchtVon(wurdegebucht);
buchungen.add(trans);

}catch(ParseException ex2){
}
}
getBuchungenMitKontogebuehren(buchungen, jahr);
}

[/HIGHLIGHT]

[HIGHLIGHT="Java"]

public static List<TransaktionsDaten> getBuchungenMitKontogebuehren(List<TransaktionsDaten> buchungen, int jahr)
{
List<TransaktionsDaten> result = new ArrayList<TransaktionsDaten>();

GregorianCalendar cal = new GregorianCalendar();

for(TransaktionsDaten b: buchungen)
{
cal.setTime(b.getDatum());
System.out.println("getGebuchtMitKontogebuehren - Datum: " + b.getDatum());
// System.out.println("getGebuchtMitKontogebuehren - Jahr: " + jahr);

if((cal.get(Calendar.YEAR)==jahr) && (cal.get(Calendar.MONTH)== Calendar.DECEMBER) && (cal.get(Calendar.DAY_OF_MONTH) == 31))
{
System.out.println("ich wurde einfach gebucht: " + b.getTransaktionGebuchtVon());
if(b.getTransaktionGebuchtVon().contains("Kontogebuehren"))
{
result.add(b);
}
}
}
System.out.println("ich bin das Ergebnis: " + result);
return result;
}
[/HIGHLIGHT]
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Zurück
Oben