Zum Inhalt springen

Doppelte Zeilen bei der Ausgabe ausblenden


Empfohlene Beiträge

Geschrieben (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 von PeeAyy
Geschrieben

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? :)

Geschrieben

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.

Geschrieben

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.

Geschrieben
@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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...