CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Java] Array == Array

ScientificBird
ScientificBird
Niveau 9
16 mai 2015 à 20:58:41

Bonjour ! Je n'arrive pas à achever un programme pourtant simple. Parmi plusieurs tables de multiplications, l'utilisateur en choisit deux ou trois et le programme doit y trouver les éventuels nombres communs.

Tout d'abord, je voudrais éviter d'utiliser des Maps, j'utilise déjà un Array, j'aimerai me limiter niveau Collections (donc j'utiliserai ça en dernier recours). Donc j'ai d'abord essayé la solution suivante :

:d) J'ordonne les éléments de ma liste
:d) Je regarde si tel élément est égal à telélément+10
:d) Si oui j'ai mon doublon, sinon, je retire l'élément en question.

Voici ce que ça donne pour deux tables (je dois au moins avoir 12 et 72 par exemple a la fin) :

http://pastebin.com/kLGWC5c6

D'un point de vu logique ma solution semble ok je crois, A la fin, une fois mes éléments triés dans l'ordre, bah je regarde si la valeur de ma liste à l'index i est égale à la valeur contenue dans l'index i+10 (oui pardon c'est bien +10 pas +1) autrement je retire de la liste...bah ça marche pas et je vois pas pourquoi ma solution me semble logique pourtant :pf:

Que se passe t-il ? :noel:

ScientificBird
ScientificBird
Niveau 9
18 mai 2015 à 12:39:55

Oups désolé j'ai supprimé le code, le revoici !

http://pastebin.com/aXF0mPHN

Pseudo supprimé
Pseudo supprimé 18 mai 2015 à 13:28:04

La première erreur est le i++ à la ligne 79, je suppose que tu voulais plutôt mettre i+1. À savoir que i++ c'est i+=1 et non pas i+1.

Deuxièmement je trouve que c'est une mauvaise idée d'enlever directement des valeurs de l'arraylist alors que tu le parcours toujours, puisque des indexes seront modifiés (ça cassera ton Collections.sort()). Ajoutes un System.out.println("La nouvelle liste est: " + conteneur) après le contenur.remove(i); pour mieux comprendre ce que j'essaie d'expliquer.

Sauvegardes les éléments que tu veux supprimer, et procèdes-y après la fin de la boucle for.

PS: Pas trop compris l'histoire du i+10.

Message édité le 18 mai 2015 à 13:30:19 par Pseudo supprimé
ScientificBird
ScientificBird
Niveau 9
18 mai 2015 à 15:20:57

Merci DPS ! J'ai corrigé, bien que ça ne me donne toujours pas uniquement 85 si je prends les tables de 17 et de 5 par exemple...le but du code étant de sortir les nombres identiques entre deux ou plusieurs tables. Et je ne comprends pas pourquoi. J'ai une liste composée de :

[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65,70, 75, 80, 85, 90, 95, 100,17, 34, 51, 68, 85]

Pourquoi en sortie j'ai :

[10, 17, 25, 34, 40, 50, 55, 65, 70, 80, 85, 90, 100]

C'est totalement con, enfin si i correspond à 10, i+1 ne fait pas 17 bordel :rire:

Vraiment, je comprends pas mon programme :noel:

Le i+10 était une erreur, désolé, c'est bien une comparaison via i+1 grâce au sort() !

Message édité le 18 mai 2015 à 15:21:38 par ScientificBird
Darkandgel
Darkandgel
Niveau 10
18 mai 2015 à 16:36:24

Tout mettre dans un seul tableau et comparer les uns aux autres, ca me parait un peu casse gueule.

Je verrais plus un truc comme ça :
Mettre toutes les tables selectionnées dans un ArrayList
Transformer tes tableaux int[] en ArrayList<int>

Pour chaque table selectionnée
Pour chaque table suivante
Pour chaque element de la table selectionnée, vérifier s'il est dans la suivante
Si oui : ajouter l'element dans la table resultats
Une fois la table selectionnée parcourue, passer a la suivante.

Edit : dans un pastebin ca rend mieux : http://pastebin.com/AGJEx9z8
ArrayList<ArrayList<int>> selectedTables; ArrayList<int> reslut; for(int i=0; i<selectedTables.length-1; i++) //pour chaque table selectionnée. On ne teste pas la derniere, parce qu'on sera deja forcement passé dedans { for(int j=i+1; j<selectedTables.length; j++)//pour chaque table suivante { foreach(int value : selectedTables.get(i))//pour chaque valeur de la table selectionnée { if(selectedTables.get(i).contains(value)){result.add(value); } } }

Je précise que j'ai pas testé le code, c'est juste un truc qui me passe par la tete, yaura ptetre des trucs a ajuster

Message édité le 18 mai 2015 à 16:40:44 par Darkandgel
PaulAimik
PaulAimik
Niveau 10
19 mai 2015 à 00:25:07

Il y a des solutions plus claires c'est sûr, mais il y a plusieurs erreurs ici :

for(int i = 0; i < conteneur.size() ; i++){
        if (conteneur.get(i) != conteneur.get(i++)){
                conteneur.remove(i);
        }

1) celle déjà trouvée par [DSP] (ie : remplacer get(i++) par get(i+1) )

2) pour le dernier élément, i+1 (ou i++) n'existe pas, j'ai pas fait de java depuis longtemps et suppose que ArrayList::get() ne lance pas d'exception en cas de débordement donc c'est pas vraiment une erreur.
Toutefois c'est pas une bonne habitude à prendre quand on peut éviter facilement tout débordement. eg : for(int i=0, n=collection.size()-2; i<=n; i++)

3) tu enlèves des éléments tout en parcourant ton tableau par ordre ascendant.

Si tu déroules la boucle tu te rendra compte que ca ne fonctionne pas :
par exemple admettons que le tableau soit [3,4,5,6]
à i=0, on enlève 3. Le tableau vaut désormais [4,5,6]
à i=1, on teste donc si 5 != 6, et on a donc sauté le 4 qui restera !

Pour éviter ca tu peux parcourir ton tableau à rebours (pratique courante quand on veut par exemple enlever tous les éléments d'une même valeur), et/ou modifier i pour prendre en compte le décalage engendré par la suppression d'un élément.
Ca peut être un bon exercice ; même si le plus simple/élégant serait plutôt de ne pas modifier la collection et ajouter les résultat dans une autre.

Enfin, ta solution (concaténer + trier les 2 tables de multiplications) est tout à fait valide, et ca devrait fonctionner une fois corrigée.
Surtout si c'est un exercice, c'est mieux de prendre le temps de comprendre et corriger ses erreurs, plutôt que d'éviter le problème en changeant directement de solution.

Darkandgel
Darkandgel
Niveau 10
19 mai 2015 à 13:57:10

pour le dernier élément, i+1 (ou i++) n'existe pas, j'ai pas fait de java depuis longtemps et suppose que ArrayList::get() ne lance pas d'exception en cas de débordement donc c'est pas vraiment une erreur.

Non, tu as bien une erreur en cas d'out of bonds :
http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#get%28int%29

Enfin, ta solution (concaténer + trier les 2 tables de multiplications) est tout à fait valide, et ca devrait fonctionner une fois corrigée.

Dans la cas spécifique ou on n'a que 2 tables, oui, ça marche.
Mais dès que tu voudras modifier un peu le truc (pour prendre en compte 3 tables par ex, comme c'est mentionné dans l'énoncé), tu vas te retrouver avec des effets de bords a corriger (en l’occurrence, tu pourras avoir des doublons dans la table que tu voudras afficher)

PaulAimik
PaulAimik
Niveau 10
19 mai 2015 à 23:01:23

Ok pour get(), une raison de plus pour éviter de déborder.

Sinon pour plusieurs tables je vois pas le soucis.
Il peut créer une fonction du style ArrayList calcIntersection(ArrayList a, ArrayList b) contenant le code (corrigé) qu'il a déjà fait.
Puis calculer l'intersection successivement pour toutes les tables :

ArrayList intersection = tables[0];
for(int i=1; i<tables.length; i++){
	intersection = calcIntersection(intersection, tables[i]);
}
Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment