PeeAyy Geschrieben 11. Mai 2011 Geschrieben 11. Mai 2011 (bearbeitet) Hi, stecke an einer bestimmten Stelle in Java fest und hoffe das mir hier jemand helfen kann. Dieses Programm liest eine Log-datei(z.B. txt) ein und gibt Zeilen aus die eine bestimmte Zeichenfolge beeinhalten. Leider kommt es vor das in Log-dateien häufig der Selbe String vorkommt und in meiner Ausgabe erscheint... Allerdings ist es für mich nicht wichtig wie oft die Meldung im log steht. Einmal reicht. Example (so könnte der output aussehen): package adjkadjak: not found package adjkadjak: not found package adjkadjak: not found adasd: bad-item Wie bekomme ich es nun hin, dass der selbe String nur EINMAL im output erscheint? :confused: Vielen Dank.. package NewTestCases; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ParseAndFilter { public static void main(String[] args) throws IOException { System.out.println("~~~~Buildvorgang Verifizierung~~~~ \n \n" //Eingabe + "Bitte geben den Dateipfad an: \n "); BufferedReader pathReader = new BufferedReader(new InputStreamReader( //Pfad einlesen System.in)); String path = pathReader.readLine(); try { BufferedReader reader = new BufferedReader(new FileReader(path)); //Datei einlesen String zeile = null; String regex = ".*: not found.*|.*bad-item.*|.*Cannot find.* "; //Suchwörter while ((zeile = reader.readLine()) != null) { Pattern p = Pattern.compile(regex); Matcher m = p.matcher(zeile); while (m.find()) { System.out.println(zeile.substring(m.start(), m.end())); //Ausgabe } } reader.close(); } catch (Exception ex) { ex.printStackTrace(); } } }[/PHP] Bearbeitet 11. Mai 2011 von PeeAyy Zitieren
etreu Geschrieben 11. Mai 2011 Geschrieben 11. Mai 2011 Merke dir die letzte Zeile und vergleiche die aktuelle mit dieser, bevor du sie ausgibst! Zitieren
itazubi Geschrieben 11. Mai 2011 Geschrieben 11. Mai 2011 Was ich noch gefunden hab: HashSet, TreeSet Zitieren
PeeAyy Geschrieben 11. Mai 2011 Autor Geschrieben 11. Mai 2011 dankeschön... jo HashSet, TreeSet.. hab ich auch gefunden.. also gernell Map & Set usw.. aber dazu müsste ich ja vorher wie etreu schrieb.. die letzte Zeile "merken" bevor ich all das anwenden könnte.. weiß nur leider nicht wie ich das am besten machen sollte.. vielleicht.. Array´s, ArrayList oder so? Nur wie? ^^ gibts da Vorschläge? Zitieren
itazubi Geschrieben 11. Mai 2011 Geschrieben 11. Mai 2011 ArrayList und in die alles reinlesen bevor du was ausgibst. Dann kannst du die Sets anwenden. Zitieren
Ulfmann Geschrieben 11. Mai 2011 Geschrieben 11. Mai 2011 Eine Collection, die das Set Interface implementiert macht hier tatsächlich Sinn. Set (Java 2 Platform SE v1.4.2) A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2) TreeSet ist aber nicht notwendig, da eine Sortierung hier scheinbar keine Rolle spielt. Ein Vergleich nur mit dem Letzten String reicht hingegen nicht. Zitieren
Dragon8 Geschrieben 11. Mai 2011 Geschrieben 11. Mai 2011 Warum alles vorher in eine ArrayList stecken? Wenn du die Daten danach nicht noch weiter verarbeiten willst, und sie deswegen als ganzes brauchst, kannt du während des Einlesens die Zeilen auch gleich in eine Map speichern. Das heißt, sobald du mit dem Einlesen der Zeilen fertig bist, sind schon alle gefunden Zeilen auch nur einmalig vorhanden. Danach musst du dann einfach nur den Inhalt der Map ausgeben. Wenn du ansonsten immer nur die aktuelle Zeile mit der vorherigen vergleichst, kannst du nur doppelte Zeilen rausfiltern die nacheinander auftreten, wenn die selbe Zeile aber später in deiner Datei nochmals auftaucht, wird sie trotzdem ausgeben. Zitieren
Ulfmann Geschrieben 11. Mai 2011 Geschrieben 11. Mai 2011 @Dragon8: Kontrolliert das Map Interface nicht nur die Eindeutigkeit von Keys? Zitieren
Dragon8 Geschrieben 11. Mai 2011 Geschrieben 11. Mai 2011 @Dragon8: Kontrolliert das Map Interface nicht nur die Eindeutigkeit von Keys? Ja, stimmt, lässt sich zwar ansonsten für die Aufgabe trotzdem nutzen, aber HashSet wäre dann wohl doch die besser Wahl. Auch wenn man dann vielleicht gleich noch erwähnen sollte, dass die richtige Reihenfolge der Zeilen damit nicht mehr gewährleistet ist. Für die richtige Reihenfolge Ausgabe wäre dann eine eigene Implementierung der Set oder, halt mit kleinen Umwegen, eine Map nötig. Zitieren
PeeAyy Geschrieben 11. Mai 2011 Autor Geschrieben 11. Mai 2011 jooo.. danke hat funktioniert. hab es mit der HashMap gelöst. Zitieren
PeeAyy Geschrieben 12. Mai 2011 Autor Geschrieben 12. Mai 2011 Sooo habs jetzt einmal mit HashMap und einmal mitHashSet gelöst. Beides funktioniert prima für mein Beispiel. Für diejenigen die es interessiert: Habe Performancetests gemacht und konnte feststellen, dass beide Möglichkeiten in etwa gleich schnell funktionieren. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.