hi,
wie kann man in Java mehrere Strings miteinander vergleichen?
z.b. funktioniert sehr gut : String1.equals(String2);
ich kann ja auch sowas schreiben: (String1.equals(String2) && String1.equals(String3))
geht es irgendwie so? String1.equals(String2).equals(string2); //**
?
P.S.-könnten Ihr mir auch vielleicht über die Geschichte über den ganzen Pünktchen erzählen? Das kapiere ich nicht ganz. Und warum funktioniert die //** Zeile nicht?
HashSet enthält keine Duplikate. Wenn also alles gleich ist, verwirft HashSet alle außer dem ersten. Somit ist bei Gleichheit aller Objekte die Länge des HashSets 1 und dann wird true zurückgegeben.
Java und Performance? Die ist relativ ;-) (Wenn ich daran denke was die VM so an Performance verbraucht) Wenn ich performant sein muss setzte ich dann doch noch lieber auf C/C++
Ausserdem ist die von The_S doch schon sehr performant und auch recht elegant
Aber ich will keinen Religionskrieg auslösen ;-)
Ausserdem hat "genial" immer zwei Seiten - genial einfach einzusetzen muss nicht automatisch performant sein. Die Software an der ich aktuell arbeite ist rein interaktiv - Die CPU macht eigentlich nichts anderes als auf Benutzeraktionen zu warten - also könnte ich so etwas locker einsetzen.
Ja, beim Vergleich von wenigen Objekten wird der Aufwand der Set-Konstruktion alles andere dominieren. Bei mehr Objekten fällt das aber kaum noch ins Gewicht. Ich habe das Gefühl, das man oft unterschätzt, wie leistungsfähig Sets sind (habe ich erst neulich bei einer Projekt-Euler-Aufgabe gemerkt, wo ich noch Duplikate aus meiner Lösung entfernen musste)
OK, wenn wirklich alle Elemente gleich sind, dann ist es nicht sehr viel langsamer (mal von dem ganzen Overhead mit Konvertierung von Array in Liste und den ganzen zusätzlichen Aufrufen beim adden/puten, die über ein einfaches equals hinausgehen, abgesehen). Aber wenn du bspw. 10.000 Elemente hast und da bereits das 2te ungleich dem 1ten ist, wird der Mechanismus für die verbleibenden 9.998 Elemente trotzdem ausgeführt, obwohl das gar nicht notwendig wäre.
worst case szenarien sind so und so immer kritisch zu betrachten bei PerPro diskussionen...
Die Frage ist wie sehr schlagen diese "unnötigen" Vergleiche auf die Performance - und um das geht es ja. Performance wird immer mit Speicher/Zeitbedarf gleichgesetzt nicht mit redundanten Operationen.
Wobei man sich dann fragen sollte, warum nimmt man nicht gleich die andere Variante, die
1.) (imho) leichter verständlich (vor allem für Anfänger) und
2.) in jedem Fall performanter ist, sowie
3.) auch mit Worst-Case Szenarien keine Probleme hat.
Eigentlich recht einfach zu verstehen:
xs ist die Liste (sagen wir [A,B,C,D]), tail xs die Liste ohne das erste Element (also [B,C,D]). zipWith verbindet zwei Listen paarweise mit einer gegebenen Funkion, hier == (also in unserem Beispiel [A==B, B==C, C==D], überzählige Elemente werden ignoriert). Die Funktion and testet, ob alle Elemente einer booleschen Liste True sind.
Natürlich gibt es Sprachen, wo das ganze noch kürzer wird, wie J oder Golfscript.