Comment "nommer" un objet pour le retrouver (String) ?

Comment "nommer" un objet pour le retrouver (String) ? - Java - Programmation

Marsh Posté le 03-05-2019 à 14:16:57    

Bonjour
 
C'est pas la première fois que je suis bloqué à ce niveau.  Je suis sur le puzzle Darts de CodinGame, et je dois donc gérer une partie de flechettes, avec des joueurs et leurs scores qui augmentent.  Je ne sais pas si c'est ça qu'il faut faire mais par exemple nommer mes objets User avec leur nom (joe, jack, billy) pour pouvoir les retrouver et augmenter leur score au fil des tours de tirs ?
 
Je ne sais pas comment faire.
 
A chaque tour CodinGame m'envoie un String "Nom du joueur" puis son tir (int X, int Y sur la cible)
 
Merci d'avance si vous pouvez m'aider


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Marsh Posté le 03-05-2019 à 14:16:57   

Reply

Marsh Posté le 03-05-2019 à 22:57:16    

Reply

Marsh Posté le 04-05-2019 à 06:58:29    

Merci !


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Marsh Posté le 06-05-2019 à 14:59:44    

Ça fonctionne très bien, merci encore
 
Bon maintenant je dois trier par scores, descendant, ET, en cas d'égalités, par ordre d'arrivée dans le jeu
 
Alors là je réfléchiiiiiiiis :lol:


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Marsh Posté le 06-05-2019 à 17:10:47    

Une SortedMap (TreeMap par exemple) peut conserver ta collection de clés-valeurs dans un ordre arbitraire, mais le tri peut uniquement se faire sur les clés.

 

Si ta collection de joueurs n'est pas énorme, tu peux sans problème la trier à chaque appel.
Si tu veux vraiment la maintenir dans un ordre qui dépend des clés et des valeurs, il doit y avoir moyen en combinant plusieurs structures de données comme TreeMap, PriorityQueue, BiMap (dans Google Guava), etc.

Message cité 1 fois
Message édité par DDT le 06-05-2019 à 17:11:06

---------------
click clack clunka thunk
Reply

Marsh Posté le 06-05-2019 à 18:24:24    

DDT a écrit :

Une SortedMap (TreeMap par exemple) peut conserver ta collection de clés-valeurs dans un ordre arbitraire, mais le tri peut uniquement se faire sur les clés.
 
Si ta collection de joueurs n'est pas énorme, tu peux sans problème la trier à chaque appel.


Surtout qu'avec le timsort de java 7, trier une collection quasi-triée est très efficace. Sinon, treeset avec un comparateur custom je présume (priorityqueue ça donne le min/max, mais toute la collection n'est pas nécessairement triée). Par contre faut bien penser à sortir l'élément, le mettre à jour puis le réinsérer, si l'objet est modifié en place la collection le verra pas et va pas le bouger au bon endroit.
 
Tu peux utiliser une hashmap pour indexer, ou même faire une recherche linéaire s'il y a peu d'entrées ce sera beaucoup plus rapide.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-05-2019 à 21:12:18    

Merci, je vais étudier vos pistes


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Marsh Posté le 07-05-2019 à 00:32:20    

Warf j'y suis arrivé, avec un Comparator maison :
 

Code :
  1. private static Comparator<Member> compare = new Comparator<Member>() {
  2.  
  3.        public int compare (Member member1, Member member2) {
  4.  
  5.            int comparaisonScore = Integer.compare(member2.getScore(), member1.getScore());
  6.  
  7.            if (comparaisonScore != 0)  {return comparaisonScore;}
  8.  
  9.            else {
  10.                int position1 = member1.getPosition();
  11.                int position2 = member2.getPosition();
  12.  
  13.                return Integer.compare(position1, position2);
  14.            }
  15.        }
  16.    };


 
(position1 et 2 c'est l'ordre d'arrivée des Users dans le jeu, je m'en sert si le score est égal)
 
Il y a longtemps que je voulais arriver à faire un double tri (trier sur 2 critères)
 
J'y suis arrivé avec 2 HashMap, 1 avec nom du joueur et son score, l'autre avec nom du joueur et sa position dans l'ordre d'arrivée, ensuite je mets tout dans des objets Members (nom, score, position) que je mets dans un arrayList que je trie (Collections.sort)
 
 [:cerveau d]  
 
Je suis pas arrivé à le pondre moi même, j'ai trouvé sur le web un gars qui trie sur 3 critères


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Marsh Posté le 07-05-2019 à 08:12:40    

Si t'es en Java 8, Comparator a pas mal de nouvelles méthodes pour faciliter ou combiner. Ici au lieu d'un comparateur custom tu pourrais utiliser

Code :
  1. Comparator.comparingInt(Member::getScore).thenComparingInt(Member::getPosition)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-05-2019 à 09:55:32    

Ahh oui je vais essayer


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Marsh Posté le 07-05-2019 à 09:55:32   

Reply

Marsh Posté le 07-05-2019 à 13:37:24    

Marche très bien.  Et très compact
 

Code :
  1. Collections.sort(list, Comparator.comparingInt(Member::getScore).reversed().thenComparingInt(Member::getPosition));


 
Merci !


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Marsh Posté le 07-05-2019 à 18:45:45    

J'ai tout refondu mon code, j'ai plus que une HashMap<String, Member>.  Au fil des tours j'extrais mes members, je modifie le score et je les réinsère.  A la fin je parcours le HashMap pour tout mettre dans un ArrayList et faire mon fameux tri.  Je vais voir si comme il me semble que vous m'avez conseillé je peux trier le HashMap ou utiliser un Tree


---------------
Mes apps  |  Viens coder  |  Mon topal de vente
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed