18. maj 2006 - 18:45Der er
38 kommentarer og 2 løsninger
Datoalgoritme til to ting - hurtig hjælp behøves
Hej, Dette er virkelig vigtigt for mig, at det bliver løst så hurtigt som muligt, så jeg håber virkelig på en masse hjælp fra jer derude...!
Jeg skal kode en save- og søge-funktion, hvor jeg behøver hjælp til følgende:
1) Jeg skal først validere om input i et JTextField er i korrekt datoformat, nemlig dd-mm-yy (f.eks. 18-05-06). Hvis det er korrekt, gemmes dato sammen med nogle andre poster i en fil. Hvis ikke, skal en messageDialog give besked om at man skal forsøge igen.
2) Derefter skal det være muligt at søge på datoformat fra samme JTextField. Dvs. at man skal kunne søge på en vilkårlig dato, f.eks. 18-05-06, hvorefter man klikker på en knap "Søg dato" og alle poster gemt med den givne dat vises i et felt. Hvis forkert, skal en messageDialog give besked om at formatet er forkert - f.eks. hvis man kommer til at taste 18-13-06 eller 32-12-06 (fordi der ikke eksisterer en 13. måned eller en 32. dag).
3) Til slut vil jeg gerne gøre det muligt at søge på måned på to måder: A) Hvor man kan indtaste en af de tolv måneder [01-12], dvs. midten af dato-formatet, hvorefter man klikker på en knap "Søg måned" og alle poster i den givne måned vises, og B) Hvor man kan indtaste månedens navn som en streng ["januar"-"december"] og klikke på selv samme knap, "Søg måned".
Hmm, jeg tilføjer private static DateFormat df = new SimpleDateFormat("dd-MM-yy"); sammen med mine andre variabeldeklarationer.
Når jeg så tilføjer df.parse(dateField); i try-catch blokken i addEvent/addBtn metoden jeg har listet her, laver den vrøvl om at parse ikke er en metode for et JTextField.
if (!validateDate (datefield.getText()) { JOptionPane.showMessage ("Fejl i dato"); return; }
2)
Kunne være noget a la:
public Book[] findBooksFromDate (String date) { if (!validateDate (datefield.getText()) { JOptionPane.showMessage ("Fejl i dato"); return new Book[0]; }
Book[] books = archive.getBooks(); // Du må have en eller anden metode hvor du kan hente alle Book's ud? ArrayList foundBooks = new ArrayList();
for (int i = 0; i < books.length; i++) { if (books[i].getDate().equals (date)) foundBooks.add (books[i]); }
return (Book[])foundBooks.toArray (new Book[0]); }
3)
Måske:
3a)
public Book[] findBooksFromMonth (int month) throws ParseException { if (month < 0 || month > 12) { JOptionPane.showMessage ("Fejl i måned"); return new Book[0]; }
Book[] books = archive.getBooks(); ArrayList foundBooks = new ArrayList();
for (int i = 0; i < books.length; i++) { String month = books.getDate().split("-")[1]; int intMonth = Integer.parseInt (month); if (intMonth == month) foundBooks.add (books[i]); } }
3b)
public int convertMonth (String month) { if (month.equalsIgnoreCase("januar")) return 0; if (month.equalsIgnoreCase("februar")) return 1; if (month.equalsIgnoreCase("marts")) return 2; if (month.equalsIgnoreCase("april")) return 3; if (month.equalsIgnoreCase("maj")) return 4; if (month.equalsIgnoreCase("juni")) return 5; if (month.equalsIgnoreCase("juli")) return 6; if (month.equalsIgnoreCase("august")) return 7; if (month.equalsIgnoreCase("setptember")) return 8; if (month.equalsIgnoreCase("oktober")) return 9; if (month.equalsIgnoreCase("november")) return 10; if (month.equalsIgnoreCase("december")) return 11; }
Og den bruges så på følgende måde:
int month = convertMonth ("februar"); Book[] books = findBooksFromMonth(month);
Det er måske ikke den bedste søgealgoritme der findes, da den løber alle poster igennem lineært. Men det er svært at gøre den bedre uden at vide om du har database til rådighed og om du har et persistenslag hvor du cacher dine objekter og lignende ting.
public int convertMonth (String month) { if (month.equalsIgnoreCase("januar")) return 0; if (month.equalsIgnoreCase("februar")) return 1; if (month.equalsIgnoreCase("marts")) return 2; if (month.equalsIgnoreCase("april")) return 3; if (month.equalsIgnoreCase("maj")) return 4; if (month.equalsIgnoreCase("juni")) return 5; if (month.equalsIgnoreCase("juli")) return 6; if (month.equalsIgnoreCase("august")) return 7; if (month.equalsIgnoreCase("setptember")) return 8; if (month.equalsIgnoreCase("oktober")) return 9; if (month.equalsIgnoreCase("november")) return 10; if (month.equalsIgnoreCase("december")) return 11;
return -1; }
Hvis metoden returnerer -1, så ved du at der ikke er indtastet en gyldig måned.
Jeg har fundet lidt ud af, at det nok er bedst hvis alle months bliver hentet ind i f.eks. en JComboBox ved opstart, og når brugeren vælger en måned fra listen, f.eks. maj, bliver alle arr. fra den måned vist. Endvidere har jeg tænkt lidt på, om man ved visning af hele listen (listeventsBtn), kan sortere arr. efter dato?
Hmm, ja, det er egentlig lidt svært at svare på. Det er jo sådan, at EventIO.java håndterer læsning og skrivning til harddisken (du kan selv lige se dens opbygning). Men i GUI.java, hvor jeg har min actionPerformed metode, har jeg alle søgealgoritmer. Så måske det skal være under if(e.getSource() == listevents)... ? Det hjælper nok en del hvis du bygger projektet.
1) Tilføj følgende statiske metode i "EventComponents.java" :
public static java.util.Comparator DateComparable() { final java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yy"); java.util.Comparator com = new java.util.Comparator() { public int compare(Object o1, Object o2) { EventComponents ev1 = (EventComponents)o1; EventComponents ev2 = (EventComponents)o2;
Og hvis du vil have at den også inkluderer tidspunkt i sorteringen:
public static java.util.Comparator DateComparable() { final java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yy HH:mm"); java.util.Comparator com = new java.util.Comparator() { public int compare(Object o1, Object o2) { EventComponents ev1 = (EventComponents)o1; EventComponents ev2 = (EventComponents)o2;
Håber ikke nogen er stødt over pointfordelingen? :-S
Nuvel, jeg har en sidste ting til dig mikkelbm. Mit program er sådan set færdigt, men jeg fundet ud af at når man tilføjer et arrangement, må der gerne være en try-catch der sammenligner om datoformat stemmer overens med den måned brugeren har valgt - dvs. den skal brokke sig hvis man f.eks. vælger januar måned og i datofeltet angiver 05-05-06. Jeg har i øvrigt programmeret en JComboBox, der lister et arrays indhold (dvs. alle måneder), så brugeren ikke længere kan skrive måneden...
Jeg har en idé, men den kræver en lille smule omstrukturering. Hvorfor er det egentlig at du gemmer måned og dato? Du har jo måned implicit i din dato?
Så min idé går ud på at skrotte måned og bare have en dato.
Hmm... Tjah... Det er så ikke min mening, når du alligevel skal vælge dag og år - men den er vel heller ikke interessant, når din lærer mener noget andet :)
Jo jo, jeg deler samme mening, og jeg behøver heller ikke at strukturere programmets logik sådan, men jeg orker næsten ikke at sidde og rode med det mere (læs: vil være færdig i løbet af i dag :)... jeg skal i øvrigt også lige se om ikke jeg kan gøre det sådan, at priceField kun accepterer tal (doubles). Men så skal det vel gemmes anderledes i filen?
Egentlig ikke en fejl. Du har oprettet en metode (checkMonthAndDate). Men i addEvent skal jeg vel referere til metoden, så den virker - eller helt undlade at skrive den som metode? Har lige testet med at oprette noget i januar og angivet september i datoformatet... der brokker den sig ikke, men tilføjer det :(
else if (!checkIsNumber (month)) { infoLabel.setText("Måned ikke korrekt!"); Toolkit.getDefaultToolkit().beep(); } else if (!checkMonthAndDate (date, month)) { infoLabel.setText("Dato og måned stemmer ikke overens!"); Toolkit.getDefaultToolkit().beep(); }
Når jeg har tilføjet de to else if-betingelser til min addEvent, får jeg flg. fejl: checkMonthAndDate(java.lang.String,int) in GUI cannot be applied to (java.lang.String,java.lang.String) - hvad mangler jeg lige her? :)
At parse din month til en integer. Det kan du enten gøre inden du smider den ned i metoden, eller du kan ændre metoden til at tage imod en String i stedet for, og så parse den String nede i metoden.
Det er stadig helt skørt... jeg lader det lige være indtil du får tid til at lege med min kode og selv ser om du kan få det til at virke. Indtil da lader jeg det altså bare være...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.