![]() |
SELFHTML Forumsarchiv |
|
|
Die folgende Nachricht zum Thema stammt von: Diana, 30. 12. 2003, 15:53
Guten Tag!
Dieser einfache Code welcher überprüfen soll ob die Zeichen a oder e in einem String vorkommen ergibt immer eine Fehlermeldung. Kann man denn keine Zeichen vergleichen?
for(int i=0;i<=strText.length()-1;i++){
if(strText.charAt(i)=='a'||'e') {
System.out.println(strText.charAt(i));
}
}
Fehler:
"...operator || cannot be applied to boolean,char if(strText.charAt(i)=='a'||'e') {..."
Diana
Die folgende Nachricht zum Thema stammt von: Cheatah, 30. 12. 2003, 15:59
Hi,
»» Dieser einfache Code welcher überprüfen soll ob die Zeichen a oder e in einem String vorkommen
derartige Vereinfachungen gehen in fast keiner Programmiersprache.
»» if(strText.charAt(i)=='a'||'e') {
Dies sind zwei Prüfungen, die Oder-verknüpft werden. Die erste lautet "strText.charAt(i)=='a'", die zweite "'e'".
Cheatah
--
X-Will-Answer-Email: No
X-Please-Search-Archive-First: Absolutely Yes
Die folgende Nachricht zum Thema stammt von: Diana, 30. 12. 2003, 16:12
Du hast recht! Könnte sein dass dies in VB funktioniert?!
Die folgende Nachricht zum Thema stammt von: Cheatah, 30. 12. 2003, 16:16
Hi,
»» Könnte sein dass dies in VB funktioniert?!
keine Ahnung, ich kann kein VB.
Cheatah
--
X-Will-Answer-Email: No
X-Please-Search-Archive-First: Absolutely Yes
Die folgende Nachricht zum Thema stammt von: Daniel Thoma, 30. 12. 2003, 16:13
Hallo Diana,
Du kannst Dein Programm entweder wie von Cheata vorgeschlagen verbessern, oder reguläre Ausdrücke verwenden. Da kannst Du natürlich so etwas machen:
if(my_string.matches("a|b")) {
//mach was
}
Grüße
Daniel
Die folgende Nachricht zum Thema stammt von: Cheatah, 30. 12. 2003, 16:17
Hi,
»» Du kannst Dein Programm entweder wie von Cheata vorgeschlagen verbessern, oder reguläre Ausdrücke verwenden.
gerade bei der Einfachheit der Vergleiche - und da sich diese zudem innerhalb einer Schleife befinden - wäre das ein völlig unnötiger Performanceverlust. Im Prinzip hast Du natürlich Recht; man sollte RegExp aber immer mit Bedacht einsetzen.
Cheatah
--
X-Will-Answer-Email: No
X-Please-Search-Archive-First: Absolutely Yes
Die folgende Nachricht zum Thema stammt von: Daniel Thoma, 30. 12. 2003, 19:11
Hallo Cheatah,
»» gerade bei der Einfachheit der Vergleiche - und da sich diese zudem innerhalb einer Schleife befinden - wäre das ein völlig unnötiger Performanceverlust. Im Prinzip hast Du natürlich Recht; man sollte RegExp aber immer mit Bedacht einsetzen.
Klar natürlich ist das minimal langsamer. Aber in den meisten Fällen dürfte das belanglos sein. Wenn man das nicht nur einmal macht, kann man den RegExp auch erst kompilieren und dann anwenden. Vermutlich ist der unterschied dann nahezu vernachlässigbar.
Grüße
Daniel
Die folgende Nachricht zum Thema stammt von: Cheatah, 30. 12. 2003, 22:29
Hi,
»» Klar natürlich ist das minimal langsamer.
wenn Du "minimal" durch "spürbar" ersetzt, stimme ich Dir zu.
»» Aber in den meisten Fällen dürfte das belanglos sein.
Das kommt darauf an, welche Fälle bei Dir meistens vorliegen. In vielen Fällen ist es ziemlich sinnvoll, eine einfache Regular Expression durch mehrere Codezeilen zu ersetzen.
»» Wenn man das nicht nur einmal macht, kann man den RegExp auch erst kompilieren und dann anwenden. Vermutlich ist der unterschied dann nahezu vernachlässigbar.
Leider nicht. Kleiner Tipp: Die sehr gerne angewendete Trim-RegExp /^\s|\s$/ wird um einiges effizienter, wenn man sie am Oder-Zeichen auftrennt und zwei daraus macht. Du siehst, man kann es richtig machen - und sehr leicht falsch.
Cheatah
--
X-Will-Answer-Email: No
X-Please-Search-Archive-First: Absolutely Yes
Die folgende Nachricht zum Thema stammt von: Daniel Thoma, 31. 12. 2003, 17:43
Hallo Cheatah,
»» wenn Du "minimal" durch "spürbar" ersetzt, stimme ich Dir zu.
Ich habe das jetzt mal ausprobiert und zu meiner überraschung festgestellt, dass Du ausgerechnet bei kurzen, aber nicht bei längeren Strings recht hast.
Beispiel:
import java.util.regex.*;
import java.util.regex.*;
public class test {
public static void main(String[] args) {
String test = "qwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertz a qwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertzqwertz";
int limit = 1000000;
long time = System.currentTimeMillis();
char c;
for(int a = 0; a < limit; ++a) {
for(int b = 0; b < test.length(); ++b) {
c = test.charAt(b);
if(c == 'a' || c == 'b') {
break;
}
}
}
System.out.println(System.currentTimeMillis() - time);
time = System.currentTimeMillis();
Pattern pattern = Pattern.compile("a|b");
for(int a = 0; a < limit; ++a) {
if(pattern.matcher(test).matches()) {
}
}
System.out.println(System.currentTimeMillis() - time);
}
}
Die Variante mit vorkompiliertem RegExp ist doppelt so schnell, wie die Variante mit Schleife. Die RegExp Variante lässt sich sogar noch weiter optimieren, indem man nicht jedes mal einen neuen Matcher erzeugt. Das war aber so schnell, dass ich mir nicht sicher war, ob das Ergebniss nicht gecacht wird.
Wenn man einen String nimmt, der sehr kurz ist (10 Zeichen oder so) ist die Schleifenvariante allerdings deutlich schneller.
Vermutlich gibt es eine Möglichkeit die Zeichen schneller hintereinander zu verarbeiten als mit dem Zugriff per charAt().
Grüße
Daniel
Die folgende Nachricht zum Thema stammt von: dimitri rettig, 30. 12. 2003, 18:51
hallo,
»» for(int i=0;i<=strText.length()-1;i++){
ich würde statt "i <= strText.length()-1" "i < strText.length()" verwenden, weil die zweite variante das gleiche ausdrückt, aber schneller arbeitet, obwohl meines wissens die java-compiler mittlerweile schon so ausgereift sind, dass sie solche "feinheiten" automatisch verbessern.
mit freundlichen grüßen
dimitri rettig
Die folgende Nachricht zum Thema stammt von: Lemmy Danger, 31. 12. 2003, 13:06
Guude!
»» »» for(int i=0;i<=strText.length()-1;i++){
»»
»» ich würde statt "i <= strText.length()-1" "i < strText.length()" verwenden, weil die zweite variante das gleiche ausdrückt, aber schneller arbeitet
Wenn Du weiter die Geschwindigkeit verbessern willst:
for(int i=0, n=strText.length(); i<n; i++) {...}
Zwar ist der Geschwindigkeitsvorteil bei solch einfachen Methoden wie length() oder bei Berechnungen wie [int] - 1 kaum mess- und erst recht nicht spürbar, aber so wird length() nur einmal (beim Start der for-Schleife) aufgerufen und nicht nach jedem Durchgang zur Prüfung der Abbruchbedingung.
»» obwohl meines wissens die java-compiler mittlerweile schon so ausgereift sind, dass sie solche "feinheiten" automatisch verbessern.
Nein, Suns JDK 1.4.2 jedenfalls verbessert da nichts.
LG ausm Hesseland
Lemmy
--
Wer seiner Frau gegenüber stets beteuert, dass DAS tatsächlich 30cm sind, darf sich nicht wundern, wenn sie nicht richtig einparken kann...
© 1998-2006
Impressum, Software: Classic Forum