Herausforderung: Forkjoinpool
Aufgabe
Stellen Sie sich vor, Sie organisieren eine große Wohltätigkeitsveranstaltung und müssen alle eingegangenen Spenden aufsummieren. Sie haben eine Liste mit Spendenbeträgen und möchten die Gesamtsumme aller Spenden ermitteln. Um diese Aufgabe überschaubarer zu gestalten, entscheiden Sie sich, die Liste in kleinere Abschnitte zu unterteilen und diese Abschnitte an Ihre Freunde zu verteilen, damit sie beim Zählen helfen. Jeder Freund berechnet die Gesamtsumme für seinen zugewiesenen Abschnitt und meldet das Ergebnis an Sie zurück. Anschließend kombinieren Sie alle diese Ergebnisse, um die endgültige Gesamtsumme zu erhalten.
Sie verfügen über eine Klasse DonationTask, die von RecursiveTask<Long> erbt. Sie müssen die Methode compute() in dieser Klasse überschreiben, um die Logik für das Aufteilen der Spendenliste und das Berechnen der Beträge zu implementieren.
Die Klasse DonationTask enthält ein konstantes Feld THRESHOLD, das auf 200 gesetzt ist. Dieser Schwellenwert gibt die maximale Anzahl von Spenden an, die ein einzelner Abschnitt enthalten darf. Ändern Sie diesen Schwellenwert nicht.
Beispielsweise sollten Sie bei einer Liste von 1.000 Spenden diese in Abschnitte von jeweils 200 oder weniger Spenden aufteilen. Anschließend berechnen Sie die Gesamtsumme, indem Sie die Ergebnisse aus jedem Abschnitt addieren.
THRESHOLD- Schwellenwert für das Aufteilen des Arrays;long[] listDonations- Quellarray mit allen Spenden;int start- Beginn des Arrays;int end- Ende des Arrays.
Es gibt außerdem eine Klasse RunnableTask, in der das Programm ausgeführt wird. Hier wird die Liste initialisiert und in einem ForkJoinPool ausgeführt. Nachdem alles gestartet ist, wird das Ergebnis angezeigt.
Wenn die Methode compute() korrekt implementiert wird, sollte die Gesamtsumme ausgegeben werden:
Sum: 500500
Lösungshinweise
In der Methode compute() muss geprüft werden, ob die Größe des Arrays (Spendenliste) kleiner als der aktuelle Schwellenwert THRESHOLD ist. Ist dies der Fall, werden einfach alle Elemente dieses Arrays (Spendenliste) durchlaufen, aufsummiert und das Ergebnis zurückgegeben.
Ist die Größe größer, muss die Mitte des Arrays gefunden und die linke sowie rechte Seite des Arrays rekursiv verarbeitet werden (als würde die Liste unter Freunden aufgeteilt).
Dazu werden zwei DonationTask-Objekte erstellt, die Array-Grenzen und das Array selbst als Parameter übergeben und anschließend die Methode fork() auf diesen Objekten aufgerufen. Abschließend wird das Summenergebnis durch Aufruf von join() auf jede Aufgabe ermittelt, die Ergebnisse addiert und die Gesamtsumme zurückgegeben.
Es klingt ziemlich kompliziert, aber tatsächlich müssen Sie nur die obige Abbildung verstehen und umsetzen!
Ich bin sicher, Sie schaffen das! Sollten dennoch Schwierigkeiten auftreten, können Sie sich die Lösung ansehen.
Sobald Sie sicher sind, dass alles funktioniert, führen Sie die Überprüfungstests im Pfad /src/test/java/TaskForkJoinTest.java aus.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 3.33
Herausforderung: Forkjoinpool
Swipe um das Menü anzuzeigen
Aufgabe
Stellen Sie sich vor, Sie organisieren eine große Wohltätigkeitsveranstaltung und müssen alle eingegangenen Spenden aufsummieren. Sie haben eine Liste mit Spendenbeträgen und möchten die Gesamtsumme aller Spenden ermitteln. Um diese Aufgabe überschaubarer zu gestalten, entscheiden Sie sich, die Liste in kleinere Abschnitte zu unterteilen und diese Abschnitte an Ihre Freunde zu verteilen, damit sie beim Zählen helfen. Jeder Freund berechnet die Gesamtsumme für seinen zugewiesenen Abschnitt und meldet das Ergebnis an Sie zurück. Anschließend kombinieren Sie alle diese Ergebnisse, um die endgültige Gesamtsumme zu erhalten.
Sie verfügen über eine Klasse DonationTask, die von RecursiveTask<Long> erbt. Sie müssen die Methode compute() in dieser Klasse überschreiben, um die Logik für das Aufteilen der Spendenliste und das Berechnen der Beträge zu implementieren.
Die Klasse DonationTask enthält ein konstantes Feld THRESHOLD, das auf 200 gesetzt ist. Dieser Schwellenwert gibt die maximale Anzahl von Spenden an, die ein einzelner Abschnitt enthalten darf. Ändern Sie diesen Schwellenwert nicht.
Beispielsweise sollten Sie bei einer Liste von 1.000 Spenden diese in Abschnitte von jeweils 200 oder weniger Spenden aufteilen. Anschließend berechnen Sie die Gesamtsumme, indem Sie die Ergebnisse aus jedem Abschnitt addieren.
THRESHOLD- Schwellenwert für das Aufteilen des Arrays;long[] listDonations- Quellarray mit allen Spenden;int start- Beginn des Arrays;int end- Ende des Arrays.
Es gibt außerdem eine Klasse RunnableTask, in der das Programm ausgeführt wird. Hier wird die Liste initialisiert und in einem ForkJoinPool ausgeführt. Nachdem alles gestartet ist, wird das Ergebnis angezeigt.
Wenn die Methode compute() korrekt implementiert wird, sollte die Gesamtsumme ausgegeben werden:
Sum: 500500
Lösungshinweise
In der Methode compute() muss geprüft werden, ob die Größe des Arrays (Spendenliste) kleiner als der aktuelle Schwellenwert THRESHOLD ist. Ist dies der Fall, werden einfach alle Elemente dieses Arrays (Spendenliste) durchlaufen, aufsummiert und das Ergebnis zurückgegeben.
Ist die Größe größer, muss die Mitte des Arrays gefunden und die linke sowie rechte Seite des Arrays rekursiv verarbeitet werden (als würde die Liste unter Freunden aufgeteilt).
Dazu werden zwei DonationTask-Objekte erstellt, die Array-Grenzen und das Array selbst als Parameter übergeben und anschließend die Methode fork() auf diesen Objekten aufgerufen. Abschließend wird das Summenergebnis durch Aufruf von join() auf jede Aufgabe ermittelt, die Ergebnisse addiert und die Gesamtsumme zurückgegeben.
Es klingt ziemlich kompliziert, aber tatsächlich müssen Sie nur die obige Abbildung verstehen und umsetzen!
Ich bin sicher, Sie schaffen das! Sollten dennoch Schwierigkeiten auftreten, können Sie sich die Lösung ansehen.
Sobald Sie sicher sind, dass alles funktioniert, führen Sie die Überprüfungstests im Pfad /src/test/java/TaskForkJoinTest.java aus.
Danke für Ihr Feedback!