In Python kann man super über Listen loopen, zB:
1 2 | for prime in list[2,3,5,7,11,17]: result = test(prime) |
Geht sowas auch irgendwie in Java, oder wie macht man das am elegantesten? Ich habe eine Anzahl von Zahlen deren Eigenschaft ich testen will.
Anmeldungsdatum: Beiträge: 330 |
In Python kann man super über Listen loopen, zB:
Geht sowas auch irgendwie in Java, oder wie macht man das am elegantesten? Ich habe eine Anzahl von Zahlen deren Eigenschaft ich testen will. |
||||||||||
![]() Anmeldungsdatum: Beiträge: 1938 Wohnort: ::1 |
Ein Array verwenden du willst. *jedihandmove* |
||||||||||
![]() Anmeldungsdatum: Beiträge: 17622 Wohnort: Berlin |
Hängt davon ab, was 'test' in Deinem Beispiel macht. Filtert es manche Zahlen aus? (Wieso ist 13 nicht in den primes?) Dann geht nicht so einfach, sondern dann brauchst Du die Deklaration einer Ergebnisliste unbekannter Länge, weswegen ein Array eine denkbar schlechte Lösung ist:
Ich kann kein Python, daher zögere ich etwas. |
||||||||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 330 |
test() ( besserer Name wär isPrime() ) sagt nur true oder false, also ob die Zahl eine Primzahl ist oder nicht. Die 13 hab ich nur vergessen hinzuschreiben. Python nimmt immer die erste Zahl in der Liste, schreibt sie auf prime geht in die Schleife, macht was mit prime, geht wieder raus und nimmt die nächste Zahl bis keine mehr da sind. Sinn der Sache war die isPrime() mit Stichproben von Primzahlen zu testen, um herauszufinden, ob ich auch keinen Fehler eingebaut habe. Wenn irgendwas schief geht soll es ausgeben, welche Zahl aus der Liste nicht gefunden wird und abbrechen, wenn alles fehlerfrei durchläuft kommt ein System.out.println("tests pass") am Ende. So hab ich es immer in Python gemacht, keine Ahnung ob es bei Java irgendwelche Tools zum testen gibt die das alles etwas vereinfachen. |
||||||||||
![]() Anmeldungsdatum: Beiträge: 2133 Wohnort: Gelsenkirchen |
Wenn die Primzahlen feststehen, würd ich's nach diesem Schema machen:
Ich bin allerdings kein Java-Experte. //edit: Oder mit ner richtigen Liste:
Oder halt mit Binden an ner Variablen:
Ich komm auch von Python und mag dieses Listen würd ich halt nur nutzen, wenn später noch was dazukommen oder rausgenommen werden soll. Ansonsten lieber Array (s. mein erstes Codebeispiel). |
||||||||||
(Themenstarter)
Anmeldungsdatum: Beiträge: 330 |
Danke das erste Bsp. funktioniert schon super. Werde da aber wohl nochmal nachlesen müssen um zu kapieren was genau passiert. |
||||||||||
![]() Anmeldungsdatum: Beiträge: 17622 Wohnort: Berlin |
Weil die Zuweisung im Beispielcode den Wert des letzten Tests wiedergibt ist dieser Code nicht so sinnvoll - so ganz allgemein könnten Arrays oder Listen geeignet sein. Grade für wiederkehrende Operationen auf Sammlungen haben viele Sprachen automatisierte Vereinfachungen, etwa bei Scala, zum Test auf ein Prädikat, sprich, eine Methode die eine Eigenschaft auf wahr/falsch testet:
oder gleich mit Zuweisung
oder Primzahlen
Oder für for-comprehensions
Das yield im letzten Beispiel hat die merkwürdige Eigenschaft, das beim Durchlaufen ein Ergebnis geliefert wird, ähnlich wie bei einem return, aber die Schleife wird nicht verlassen, sondern es wird weitergeloopt. Das i wird also nur auf die Palette gestellt, aber die Palette wird noch nicht auf den LKW geschoben - erst wenn die Schleife durchgelaufen ist werden die passenden Werte zurückgegeben. Ich dachte auf sowas wärst Du aus. Java hat derlei syntaktischen Zucker nicht. Das einzig halbwegs moderne Feature ist die vereinfachte for-loop und ein einheitlicher Zugriff auf Listen/Arrays/Sets/Maps und das Autoboxing von eingebauten Typen (int, long, float, ...)
Ohne externe Library ist das filtern/mappen usw. auf Listen mit viel Codezermoniell verbunden. |
||||||||||
![]() Anmeldungsdatum: Beiträge: 2669 Wohnort: Hamburg |
Auch wenn die Frage an sich schon beantwortet wurde, so möchte ich hier doch noch mal auf die Java Tutorials hinweisen. Dort solltest Du Dir dringend mal das Kapitel über @snafu1: Da die Zahlen ja nicht vom Himmel fallen dürften, würde ich die Lösung mit der Liste *immer* zunächst einer anderen Lösung mittels Arrays vorziehen. Um sich doppelte Arbeit zu ersparen, könnte man natürlich auch gleich zu einem |
||||||||||
![]() Anmeldungsdatum: Beiträge: 17622 Wohnort: Berlin |
Wenn die Größe des Arrays vorab bekannt ist, und außerdem bekannt ist, dass sich diese zur Laufzeit nicht ändert, dann spricht wenig gegen ein Array. Vielleicht dass Operationen, die für eine List (Set, ...) direkt aufrufbar sind bei Arrays den Aufruf statischer Hilfsmethoden erfordert, was ein kl. Umweg ist. Dafür ist das initialisieren eines Arrays manchmal praktischer. |
||||||||||
![]() Anmeldungsdatum: Beiträge: 2133 Wohnort: Gelsenkirchen |
Naja, wenn Elemente später hinzukommen, dann würde ich auch zu einer Liste greifen. Bei vorher feststehender Größe der Liste bietet es sich immer noch an, diese Größe bei der Listenerzeugung mit anzugeben (für 50 Elemente also |
||||||||||
![]() Anmeldungsdatum: Beiträge: 2669 Wohnort: Hamburg |
Sicher. Aber ich würde genau diese Fälle als Ausnahmen bezeichnen - ggf. kommt so etwas in Spezialdisziplinen (Grafik, MSR, usw.) öfter mal vor. Daher sollte man imho zuerst an eine generische und dynamische Lösung denken.
Ok, stimmt. Java fehlt da einiges an Literalen... das sollte sich Oracle mal bei C# abgucken. Andererseits: Wie oft initialisiert man denn Objekte mit x fixen Werten? 😉 |
||||||||||
Projektleitung
Anmeldungsdatum: Beiträge: 13212 |
Auf jeden Fall sollte man nicht zu früh optimieren...
Eben. Und für die paar Fälle gibt es ja auch noch
Ciao robert |
||||||||||
Anmeldungsdatum: Beiträge: 379 |
guter bildhafter Vergleich. |
||||||||||
![]() Anmeldungsdatum: Beiträge: 2133 Wohnort: Gelsenkirchen |
Wobei sich mir da die Frage stellt, ob ihr |
||||||||||
Anmeldungsdatum: Beiträge: 379 |
verstehe dein Beispiel nicht... und ich glaube schon, dass ich "for comprehensions" (in Scala) verstanden habe
wird zu
|