Défi : ForkJoinPool
Tâche
Imaginez que vous organisez un grand événement caritatif et que vous devez compter toutes les dons reçues. Vous disposez d'une liste des montants des dons et souhaitez connaître la somme totale de tous les dons. Pour rendre cette tâche plus gérable, vous décidez de diviser la liste en petits groupes et de répartir ces groupes entre vos amis pour aider au comptage. Chaque ami calcule le montant total pour son groupe attribué et vous communique le résultat. Vous combinez ensuite tous ces résultats pour obtenir le total final.
Vous disposez d'une classe DonationTask qui étend RecursiveTask<Long>. Vous devez surcharger la méthode compute() dans cette classe afin d'implémenter la logique de découpage de la liste de dons et de calcul des montants.
La classe DonationTask comprend un champ constant THRESHOLD défini à 200. Ce seuil spécifie le nombre maximal de dons qu'un groupe unique doit contenir. Ne modifiez pas ce seuil.
Par exemple, si vous commencez avec une liste de 1 000 dons, vous devez la diviser en groupes de 200 dons ou moins chacun. Ensuite, calculez le montant total en additionnant les résultats de chaque groupe.
THRESHOLD- threshold of array splitting;long[] listDonations- source array with all donations;int start- the beginning of the array;int end- end of the array.
Il existe également une classe RunnableTask où nous exécutons le programme. C'est ici que nous initialisons notre liste et l'exécutons dans un ForkJoinPool. Une fois que tout est en place et fonctionne, nous affichons le résultat.
Si vous implémentez correctement la méthode compute(), vous devriez obtenir le montant total :
Sum: 500500
Indications pour la solution
Dans la méthode compute(), il faut vérifier si la taille de notre tableau (liste des dons) est inférieure au seuil actuel, THRESHOLD. Si elle est inférieure, parfait ; il suffit de parcourir tous les éléments de ce tableau (liste des dons), de les additionner et de retourner le résultat.
Si la taille est supérieure, il faut alors trouver le milieu du tableau et traiter récursivement les côtés gauche et droit du tableau (comme si l’on divisait la liste entre amis).
Pour cela, il faut créer 2 objets DonationTask, passer les bornes du tableau et le tableau lui-même comme paramètres, puis appeler la méthode fork() sur ces objets. Enfin, on obtient le résultat de la somme en appelant join() sur chaque tâche, en additionnant les résultats, puis en retournant le total.
Cela semble assez compliqué, mais en réalité, il suffit de comprendre et d’implémenter l’illustration ci-dessus !
Je suis certain que vous pouvez y arriver ! Mais si vous rencontrez des difficultés, vous pouvez consulter la solution.
Une fois que vous êtes sûr que tout fonctionne, exécutez les tests de vérification sur le chemin /src/test/java/TaskForkJoinTest.java.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Can you explain how the compute() method should be structured?
What does the DonationTask class look like?
Can you give an example of how to split the array and sum the donations?
Awesome!
Completion rate improved to 3.33
Défi : ForkJoinPool
Glissez pour afficher le menu
Tâche
Imaginez que vous organisez un grand événement caritatif et que vous devez compter toutes les dons reçues. Vous disposez d'une liste des montants des dons et souhaitez connaître la somme totale de tous les dons. Pour rendre cette tâche plus gérable, vous décidez de diviser la liste en petits groupes et de répartir ces groupes entre vos amis pour aider au comptage. Chaque ami calcule le montant total pour son groupe attribué et vous communique le résultat. Vous combinez ensuite tous ces résultats pour obtenir le total final.
Vous disposez d'une classe DonationTask qui étend RecursiveTask<Long>. Vous devez surcharger la méthode compute() dans cette classe afin d'implémenter la logique de découpage de la liste de dons et de calcul des montants.
La classe DonationTask comprend un champ constant THRESHOLD défini à 200. Ce seuil spécifie le nombre maximal de dons qu'un groupe unique doit contenir. Ne modifiez pas ce seuil.
Par exemple, si vous commencez avec une liste de 1 000 dons, vous devez la diviser en groupes de 200 dons ou moins chacun. Ensuite, calculez le montant total en additionnant les résultats de chaque groupe.
THRESHOLD- threshold of array splitting;long[] listDonations- source array with all donations;int start- the beginning of the array;int end- end of the array.
Il existe également une classe RunnableTask où nous exécutons le programme. C'est ici que nous initialisons notre liste et l'exécutons dans un ForkJoinPool. Une fois que tout est en place et fonctionne, nous affichons le résultat.
Si vous implémentez correctement la méthode compute(), vous devriez obtenir le montant total :
Sum: 500500
Indications pour la solution
Dans la méthode compute(), il faut vérifier si la taille de notre tableau (liste des dons) est inférieure au seuil actuel, THRESHOLD. Si elle est inférieure, parfait ; il suffit de parcourir tous les éléments de ce tableau (liste des dons), de les additionner et de retourner le résultat.
Si la taille est supérieure, il faut alors trouver le milieu du tableau et traiter récursivement les côtés gauche et droit du tableau (comme si l’on divisait la liste entre amis).
Pour cela, il faut créer 2 objets DonationTask, passer les bornes du tableau et le tableau lui-même comme paramètres, puis appeler la méthode fork() sur ces objets. Enfin, on obtient le résultat de la somme en appelant join() sur chaque tâche, en additionnant les résultats, puis en retournant le total.
Cela semble assez compliqué, mais en réalité, il suffit de comprendre et d’implémenter l’illustration ci-dessus !
Je suis certain que vous pouvez y arriver ! Mais si vous rencontrez des difficultés, vous pouvez consulter la solution.
Une fois que vous êtes sûr que tout fonctionne, exécutez les tests de vérification sur le chemin /src/test/java/TaskForkJoinTest.java.
Merci pour vos commentaires !