Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hiho,
ich habe eine Liste von Projektteilnehmern (nur die IDs aus einer DB). Zu jedem dieser ID's möchte ich eine separate Arrayliste erzeugen, in der ich nach gewissen Berechnungen immer einen Wert hinzufügen kann und dann im Anschluss damit wieder weiterrechnen kann...
Ich habe sowas probiert:
Java:
public void relativanteilListenErstellen(ArrayList<Integer> projektteilnehmerListe){
int teilnehmerAnzahl = projektteilnehmerListe.size();
for (int i=0; i<projektteilnehmerListe.size(); i++){
String listenname= "relativanteilListeTeilnehmer"+projektteilnehmerListe.get(i);
ArrayList<Double> listenname = new ArrayList<Double>();
}
Auch wenn ich das direkt bei der Deklaration hinschreibe, funktioniert das nicht. Hat jemand eine Idee?
Danke schon mal und ein frohes Fest!
Ich stimme dir mit der Klasse zu, das habe ich ja selbst geschrieben, siehe "und Bastle eine "ordentliche" Datenstruktur um deine Liste."
Aber warum keine Map? Sein Anwendungsfall klingt für mich nach Map. Wenn die IDs Lücken haben, empfinde ich das als sauberste Lösung.
Ich stimme dir mit der Klasse zu, das habe ich ja selbst geschrieben, siehe "und Bastle eine "ordentliche" Datenstruktur um deine Liste."
Aber warum keine Map? Sein Anwendungsfall klingt für mich nach Map. Wenn die IDs Lücken haben, empfinde ich das als sauberste Lösung.
Spricht auch nichts gegen.
Aber irgendwo müssen die ganzen Objekte ja liegen. Und wenn man die immer anhand ihrer ID braucht, warum nicht einfach das nutzen, was dazu gedacht ist?
Und wenn du dann die Instanz mit einem bestimmten Attribut aus einer Menge (z. B. List) von Instanzen fischen musst?
Variante 1: über die List iterieren, die Attribute überprüfen, und die erste Instanz mit dem passenden Attribut zurückgeben.
Variante 2: zusätzlich zu der List eine Map<Attribut,Instanz> anlegen.
Wenn die Suche häufiger vorkommt, lohnt sich eine zusätzliche Map allemal.
ob ich jetzt selber durch die Liste meiner objecte iteriere um die passende ID zu finden oder ob es die get methode der Map macht. Wo ist denn da jetzt der Unterschied? Und wenn ich die ID in die map packe und zum Beispiel die ID anhand eines anderen Attributes der Klasse ermitteln möchte, dann habe ich mit der map komplett verloren.
Die ID ist Bestandteil des Objektes und von daher gehört sie dort rein und nicht in eine Map als key
Die meisten Entwickler bevorzugen halt ein get() gegenüber einer selbstgebastelten Schleife+if. Es ist halt - kling unglaublich, ich weiß - deutlich kürzer, besser lesbar und weniger Fehleranfällig.
Und wenn ich die ID in die map packe und zum Beispiel die ID anhand eines anderen Attributes der Klasse ermitteln möchte, dann habe ich mit der map komplett verloren.
ob ich jetzt selber durch die Liste meiner objecte iteriere um die passende ID zu finden oder ob es die get methode der Map macht. Wo ist denn da jetzt der Unterschied?
Eine HashMap ist super schnell. Nehmen wir an du hast eine ArrayList mit 1 Milliarden Einträgen. Wenn du einen Eintrag suchst musst du durch die Liste iterieren. Im besten Falle ist das gesuchte Element ganz oben. Im schlimmsten Fall ist es ganz unten. Im Durchschnitt musst du bis zur Hälfte iterieren.
Bei einer HashMap hingegen dauert es immer gleich lang. Es ist egal, ob sich das gesuchte Element weiter oben oder weiter unten befindet.
Die meisten Entwickler bevorzugen halt ein get() gegenüber einer selbstgebastelten Schleife+if. Es ist halt - kling unglaublich, ich weiß - deutlich kürzer, besser lesbar und weniger Fehleranfällig.
Mit Java 8 und den Streams bwz. Lambdas wäre das zwar auch sehr leserlich möglich, aber trotzdem gebe ich dir hierbei recht, dass man in so einem Fall besser die Map nimmt. IMHO.
Das hat erstmal doch gar nichts mit leserlichkeit o.ä. zu tun, sondern mit der Anwendung der richtigen Datenstruktur für den richtigen Anwendungsfall. Und dabei ist: Zugriff auf ein bestimmtes Element HashMap (mit sinnvollem Hash) O(1), ArrayList<ObjektmitId>, O(n).
Die ID kann ja immer noch im Objekt auch vorhanden sein...
Daran ändern Streams, Lambdas und alles was sonst noch in den Sinn kommt nicht.
Sorry aber die Hashmap kann auch keine Wunder vollbringen. Warum sollte mein eigener Code nciht genauso schnell sein? Wenn ich es will kann ich ja sogar den Suchgalgorytmus der Hashmap kopieren.
Also entweder es ist ein stupides durchiterieren, dann kann es auch nicht schneller sein als wenn man es selber macht oder es ist eine Suche in welcher Form auch immer, wahrscheinlich mit sortiertem Index was aber keine Hexerei darstellt. Oder wie stellst du dir vor das get die richtige Instanz zu einer ID findet?
Also entweder es ist ein stupides durchiterieren, dann kann es auch nicht schneller sein als wenn man es selber macht oder es ist eine Suche in welcher Form auch immer, wahrscheinlich mit sortiertem Index was aber keine Hexerei darstellt. Oder wie stellst du dir vor das get die richtige Instanz zu einer ID findet?
Die Hashcodes werden auf Buckets aufgeteilt und dann per Hashcode auf den Index zugegriffen:
"This implementation provides constant-time performance for the basic operations (get and put), assuming the hash function disperses the elements properly among the buckets."
Also entweder es ist ein stupides durchiterieren, dann kann es auch nicht schneller sein als wenn man es selber macht oder es ist eine Suche in welcher Form auch immer, wahrscheinlich mit sortiertem Index was aber keine Hexerei darstellt. Oder wie stellst du dir vor das get die richtige Instanz zu einer ID findet?
Das stimmt zwar. Aber nach meiner Erfahrung neigen Programmierer, wenn sie erst die Möglichkeit dazu haben dazu möglichst viel in eine Zeile zu pressen und das versteht zwei Wochen später keine S... mehr was das sollte. Also werden 5 Zeilen Kommentar drüber geschrieben oder hier im Forum die Frage gestellt: ich habe folgende Zeile Code, kann mir die mal jemand erklären? Wo ist da der Nutzen ?
Die Aussage unterstütze ich so nicht. Bei meinen vorherigen Projekt wurden diese auch schon aktiv eingesetzt und bisher hat keiner Probleme damit. Wir mrBrown schon sagte, man darf es nicht übertreiben weshalb sie ja auch kein Ersatz für die einfachen Loops sind sondern eine Ergänzung. Und wo ich heute morgen nochmal drüber nachgedacht habe (jetzt mal unabhängig von der Datenstruktur) würden in diesem Beispiel eine einfache Schleife + If besser sein als ein Lambda-Konstrukt.
Bei uns werden Lambdas aber auch automatisch formatiert, so dass in der Regel jeder "Punkt" in einer neuen Zeile beginnt. So erreicht man meiner Meinung nach eine ziemlich gute Lesbarkeit (solange es keine 20 Zeilen Konstrukte werden )
Ich weiss, ich habe es absichtlich ein bisschen überspitzt formuliert. Aber trotzdem konnte mir noch niemand überzeugend darlegen wozu ich die wirklich brauche. Eine gerne genommene Begründung ist: "Mit den Lambda-Ausdrücken wurde Java eine wichtige neue Funktionalität hinzugefügt, durch die funktionale Programmierung möglich ist." Da kann ich nur sagen: Aha, und warum brauche ich das ?
Auch da waren jetzt keine überzeugenden Argumente dabei. Lambdas fügen keinen Mehrwert zu der Sprache Java hinzu. Es gibt nichts was ich nicht vorher auch schon konnte. Ausser dass ich es jetzt "schöner" kann. Und dieses schöner ist sehr subjektiv.
Auch da waren jetzt keine überzeugenden Argumente dabei. Lambdas fügen keinen Mehrwert zu der Sprache Java hinzu. Es gibt nichts was ich nicht vorher auch schon konnte. Ausser dass ich es jetzt "schöner" kann. Und dieses schöner ist sehr subjektiv.
Auch da waren jetzt keine überzeugenden Argumente dabei. Java fügt keinen Mehrwert zu den vorhandenen Sprachen hinzu. Es gibt nichts was ich nicht vorher auch schon mit Assembler konnte. Ausser dass ich es jetzt "schöner" kann. Und dieses schöner ist sehr subjektiv.
Alle Sprachen sind ziemlich gleich mächtig, der Unterschied ist meistens nur, dass etwas "schöner" geht.
keine Ahnung was er da meint, ich finds "schöner" mit Stream und filter...
Warum sollte man sich den Aufwand machen, etwas selber zu schreiben, wenns getestet und zigtausendfach benutzt in der Standard-Lib vorhanden ist?
Ich weiss wir drehen uns im Kreis. Aber wieder kein überzeugendes Argument. Ich muss die "Schleife" in irgendeiner Art hinschreiben und ich muss die Bedingung der if-Abfrage hinschreiben. Bei beiden Alternativen kann ich Fehler machen, evtl. sogar die gleichen. Eine for each Schleife ist genauso getestet und zigtausendfach benutzt wie das entsprechende Lambda.
Off-topic ist es ja schon lange denn wie @DerWissende gesagt hat: das Thema ist seit 24.12.2016 tot, keine Ahnung warum es aufgewärmt wurde. Ich dachte wir könnten dann wenigstens ein paar grundsätzliche Argumente austauschen. Aber du hast Recht, wir sollten den Thread endgültig beerdigen.
Hier ist ja eine leidenschaftliche Diskussion entfacht.
Also ich kann mit der die Objekteigenschaften ändernde Methode von @feinperligekohlensaeure nix anfangen, mir fehlt da der diese Methode umkapselte Kontext der Klasse + alles Weitere...
Klartext: Ich würd ja gern die verschiedenen Methoden aufführen (gar vorführen ) und im Vergleich deren Pros und Contras diskutieren, aber das kann ich nur, wenn @feinperligekohlensaeure weiteren Input liefert.
Oder mal anders ausgedrückt: Sind es 10 Elemente, dann ist es wurscht, ob ich eine mächtige HashMap verwende, oder einfach durch eine Liste durch laufe.
Und... die Schreibweise... Lambdas sind für mich auch unnützes Zeugs, das man evtl. nach ein paar Tagen selber nicht mehr versteht. + alles Weitere