Frage zur methode CharAt

Bonsai

Bekanntes Mitglied
Hi Leute,
ich hätte mal ne Frage zu der Methode CharAt. Und zwar würde mich mal interessieren, ob es eine Möglichkeit gibt an die Methode eine Menge von Cahrs zu übergeben auf die Untersucht werden soll. Also nach dem Motto, auf einen der folgenden Chars prüfen. Weil so wie ich mir das erst gedacht hab funzt es leider nicht:
Java:
count.charAt(i) == ('0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9')
ich weiß das es funktioniert wenn ich alles einzeln ausschreiben würde und das dann jeweils mit nem oder verknüpfe, aber wollt eventuell mal schauen ob es ne elegantere Lösung gibt 🙂

Danke schon mal für eure Hilfe

Gruß
Bonsai
 
Was genau willst du tun? [c]charAt(n)[/c] liefert den n-ten Buchstaben in einem String, also [c]"Hallo".charAt(1)[/c] wäre [c]'a'[/c]. Um zu testen, ob ein [c]char[/c] eine Ziffer ist, gibt es die Methode [c]Character.isDigit(ch)[/c].
 
ok um das genauer zu präzisieren. ich habe eine Text Datei gegeben. und nun möchte is wissen, wie oft der substring "\ls" + einer beliebigen Zahl vorkommt. dazu lasse ich den Text mithilfe von charat wie folgt prüfen:
Java:
count.charAt(i) == '\\' && count.charAt(i+1) == 'l' && count.charAt(i+2) == 's'
nun müssste ich als letztes noch auf die beliebige Zahl prüfen lassen, aber dann zu schreiben :
Java:
... && (count.charAt(i+3) == '0' | count.charAt(i+3) == '1' | count.charAt(i+3) == '2' |...)
ist mir einfach zu lang. Zudem finde ich auch dass das nicht grad besonders guter Programmierstil ist. Kann mich natürlich auch täuschen. und wenn das der einzige weg ist, dann muss ich es halt so machen
 
Da würde mir nichts besseres als das einfallen:
Java:
Matcher m = Pattern.compile("\\\\ls").matcher(input);
int count = 0;
while (m.find()) {
    count++;
}
 
Da bist du mit String.split besser bedient, musst dir aber wohl Reguläre Ausdrücke ansehen (deiner ist zumindest recht einfach). Mit deinen charAt(i+2) ausdrücken, sprengst du nämlich leicht mal die Arraygrenzen, wenn du nicht aufpasst. Ausserdem ist es wie du selbst sagst kein guter Stil.
Edit: mist zu spät 😀
 
Da würde mir nichts besseres als das einfallen:
Java:
Matcher m = Pattern.compile("\\\\ls").matcher(input);
int count = 0;
while (m.find()) {
    count++;
}

Sehe ich genauso. Habe ihm gerade die selbe Lösung gesendet 😉

Java:
public static void checkFileForString(String filePath) throws FileNotFoundException, IOException {

		String line = null;

		try {
			File file = new File(filePath);
			FileReader fileReader = new FileReader(file);
			BufferedReader bufferedReader = new BufferedReader(fileReader);
			
			while ((line = bufferedReader.readLine()) != null) {
				int i = 0;
				Pattern pattern = Pattern.compile("([0-9]*)(\\\\ls)([0-9]*)");
				Matcher matcher = pattern.matcher(line);

				while (matcher.find()) {
					System.out.println("String found: (" + line.substring(matcher.start(), matcher.end()) + ")");
					i++;
				}
				System.out.println(i + "mal gefunden!");
			}
			System.out.println();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 
Zuletzt bearbeitet:
naja
Java:
text.split("\\\\ls").length
aber deine Methode ist viel schöner und angemessener.

Da sei aber noch anzumerken, dass diese Lösung nicht immer funktioniert. Wie bereits in anderen Threads angesprochen, verhält sich [c]split()[/c] etwas "speziell", wenn der zu suchende Substring am Schluss der Linie steht:
Java:
System.out.println("foobar".split("\\\\ls").length - 1); // 0 - ok
System.out.println("foo\\lsbar".split("\\\\ls").length - 1); // 1 - ok
System.out.println("\\lsfoobar".split("\\\\ls").length - 1); // 1 - ok
System.out.println("foobar\\ls".split("\\\\ls").length - 1); // 0 - NOK!
 

Zurück
Oben