Montag, 12. Januar 2009

 

Suchen und markieren in der Eingabe - Musterlösung

Musterlösung zu Suchen und markieren in der Eingabe.
Der Kernpunkt ist das Suchen in Strings. Das kann z.B. mit der Methode indexOf() gemacht werden. indexOf() liefert einen Wert kleiner 0, wenn der Suchstring nicht gefunden wurde. Daher benötigt man eine Schleife über das Ergebnis von indexOf(), da der Suchbegriff mehrmals vorkommen kann. Man muss nur immer im noch nicht durchsuchten Rest weitersuchen.
In der Lösung wird immer ein String gesucht und markiert. Die Methode wird dann für jeden Suchbegriff aufgerufen. Effizienter wäre möglicherweise eine zeilenorientierte Bearbeitung, bei der immer alle Begriffe in einer Zeile geprüft werden.

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

/**
* java-such-mark: .SuchMark.java
*
* Zweck: markiere alle Suchbegriffe in der Eingabe durch Großschreibung und
* Sternchen davor und danach.
*
* 10.01.2009, Harald R. Haberstroh
*/

/**
* TODO Zweck
*
* @author Harald R. Haberstroh (user)
*
*/
public class SuchMark {

private String[] suchbegriffe;

/**
* @param suchbegriffe
*/
public SuchMark(String[] suchbegriffe) {
this.suchbegriffe = suchbegriffe;
}

/**
* markiere alle Vorkommnisse der suchbegriffe im String content und liefere
* das Ergebnis zurück.
*
* @param content
* Eingabetext
* @return Text mit Markierungen
*/
public String mark(String content) {
for (String what : suchbegriffe) {
content = mark(content, what);
}
return content;
}

/**
* markiere alle Vorkommnisse des Suchbegriffs what im Text content. Suche die
* Position des Suchbegriffs mit indexOf() und verkleinere den content auf den
* Rest hinter den Suchbegriff, nachdem der String vor dem Suchbegriff und der
* markierte Suchbegriff an einen StringBuilder angehängt wurde.
*
* @param content
* Text
* @param what
* Suchbegriff
* @return Text mit Markierungen
*/
private String mark(String content, String what) {
StringBuilder sb = new StringBuilder();
int pos;
int len = what.length();
String wHAT = what.toUpperCase(); // der großgeschriebene Suchbegriff
while ((pos = content.indexOf(what)) >= 0) {
sb.append(content.substring(0, pos)); // alles vor Suchbegriff dazu
sb.append('*'); // Markierung...
sb.append(wHAT);
sb.append('*');
content = content.substring(pos + len); // alles vor Suchbegriff und
// Suchbegriff selbst entfernen
}
sb.append(content); // den Rest noch anhängen
return sb.toString();
}

/**
* liest eine ganze Textdatei.
*
* @param in
* geöffneter BufferedReader (Inputstream)
* @return gelesener String
* @throws IOException
*/
public String readStream(BufferedReader in) throws IOException {
StringBuilder sb = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
return sb.toString();
}

/**
* schreibt den String in Textdatei.
*
* @param out
* PrintStream zum Schreiben
* @param content
* Text zum Speichern
*/
public void writeStream(PrintWriter out, String content) {
out.write(content);
out.flush();
}

/**
* Hilfe ausgeben und Ende
*/
private static void help() {
System.out.println("Markieren der Suchbegriffe in der Eingabe.\n"
+ "Aufruf: java SuchMark [-h] [-o out] suchbegriffe...\n"
+ " -h ... Hilfe\n" + " -o out ... Ausgabe in die Datei out\n"
+ " suchbegriffe ... ein oder mehrere Suchbegriffe");
System.exit(0);
}

/**
* Ausgeben einer Fehlermeldung und optional beenden des Programms.
*
* @param exitStatus
* Programm beenden, wenn != 0
* @param format
* Formatstring (Text)
* @param objects
* Weiterer Parameter
*/
private static void fehler(int exitStatus, String format, Object... objects) {
System.err.print("FEHLER in SuchMark: ");
System.err.printf(format, objects);
if (exitStatus != 0) {
System.exit(exitStatus);
}
}

/**
* @param args
*/
public static void main(String[] args) {
if (args.length > 0) {
PrintWriter out = new PrintWriter(System.out);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
if (args[0].equals("-h")) {
help();
} else if (args[0].equals("-o")) {
// Ausgabedatei
if (args.length > 2) { // -o out such...
try {
out = new PrintWriter(args[1]);
} catch (FileNotFoundException e) {
fehler(2, "Kann Datei %s nicht für Ausgabe öffnen! (%s)\n",
args[1], e.getLocalizedMessage());
}
// Erzeuge neues args nur mit den Suchbegriffen...
String[] argumente = new String[args.length - 2];
for (int i = 0; i < argumente.length; i++) {
argumente[i] = args[i + 2];
}
args = argumente;
} else {
fehler(1,
"Es muss bei Option -o der Name einer Datei und mindestens "
+ "\nein Suchbegriff angegeben werden!\n");
}
}
// Suchbegriffe bearbeiten
SuchMark suchmark = new SuchMark(args);
String content = null;
try {
content = suchmark.readStream(in);
} catch (IOException e) {
fehler(3, "Ein-/Ausgabefehler: %s\n", e.getLocalizedMessage());
}
String markedContent = suchmark.mark(content);
suchmark.writeStream(out, markedContent);
out.close();
} else {
fehler(0, "mindestens einen Suchbegriff angeben. Hilfe mit -h\n");
}
}

}

Labels: , ,


Kommentare:

Kommentar veröffentlichen

Abonnieren Kommentare zum Post [Atom]





<< Startseite

This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]