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] probleme avec les vectors

iscario
iscario
Niveau 7
26 octobre 2009 à 15:49:20

bonjour,

J'ai un problème dans le code suivant : http://pastebin.com/m6b2e9308
le removeElement ne fonctionne jamais...
L'ajout fonctionne bien avec le addElement, par contre impossible de faire un removeElement... J'ai essayé 2facons différentes, mais rien à faire...
Je vous donne la classe Client au cas ou : http://pastebin.com/m22d5d5a1

Je vous épargne tout le code vu que le problème est à ce niveau.

merci

godrik
godrik
Niveau 30
26 octobre 2009 à 16:11:26

La fonction removeelement compare les objets grace a la fonctions equals de Client. As tu bien defini cette fonctoin ?
Si elle n'est pas defini, equals test l'egalite de reference, comme tu a l'air de recreer des objet a chaque fois, ca m'a l'air d'etre la cause de l'erreur.

iscario
iscario
Niveau 7
26 octobre 2009 à 16:14:36

oui j'ai bien redéfini equals, il est dans la classe Client. Et je n'ai pas vu d'erreur à ce niveau, mais il est vrai que je débute...

iscario
iscario
Niveau 7
26 octobre 2009 à 18:10:28

bon, j'ai testé 2-3 trucs sans résultat...

J'aurai néanmoins une autre question : j'ai rajouté un peu de code de debug pour trouver l'erreur dans la fonction qui suit.

public void retraitClient (Client clt) {

Vector v = (Vector) dico.get(clt.getSociete());
if (v == null) return;

for (int i =0 ; i< v.size() ; i++) {
Client iop = (Client) v.elementAt(i);
System.out.println(iop);
System.out.println(i);
}
if (clt.equals((Client)v.elementAt(2))) System.out.println("EGAL!!!");

v.removeElement(clt);
if (v.size() == 0) dico.remove(clt.getSociete());
}

Quand je l'exécute "EGAL" s'affiche, pourtant le removeElement ne s'exécute pas. Et là je ne comprends vraiment pas...

Autre question : si je ne cast pas le v.elementAt(2) en classe "Client", equals renvoit faux. Du coup je ne comprends pas trop quel classe il prends comme référence sans le cast...

iscario
iscario
Niveau 7
26 octobre 2009 à 18:21:02

if (v.elementAt(2).equals(clt)) System.out.println("EGAL!!!");

en fait dans ce sens là ca ne fonctionne pas d'ou le porblème je suppose...
Mais je ne comprends pas là :(

_skip
_skip
Niveau 10
26 octobre 2009 à 21:10:43

On peut voir la méthode equals de ta classe?
Sinon tu peux utiliser contains() pour vérifier que l'élément existe dans le vecteur.

Par ailleurs, la classe vector est plus vraiment recommandée à l'utilisation si jamais tu le savais pas.

iscario
iscario
Niveau 7
26 octobre 2009 à 21:17:18

la méthode equals se trouve dans le deuxième lien ( http://pastebin.com/m22d5d5a1 )

Et sinon je débute en Java, c'est ce qu'on a vu en cours, je suppose que c'est par simplicité au début... Mais effectivement je viens de lire ca en faisant mes recherches.
Mais merci pour l'info.

godrik
godrik
Niveau 30
27 octobre 2009 à 01:27:10

on est cense utilise quoi a la place de Vector ?

_skip
_skip
Niveau 10
27 octobre 2009 à 11:55:15

ArrayList...

Et si tu as besoin de la synchronisation interne tu peux toujours créer un wrapper qui gère celle-ci en écrivant :

List list = Collections.synchronizedList( MonArrayList );

L'avantage c'est que tu peux cesser d'utiliser la synchronisation si celle-ci n'est plus utile en cessant simplement d'utiliser le wrapper.

C'est bien de faire gaffe aux types de collections qu'on utilise même si on débute.

iscario
iscario
Niveau 7
27 octobre 2009 à 11:56:41

//equals version rigide
//(ici on sépare la vérification de la classe de celle des attributs
//pour un éventuel appel d'equals dans une sous-classe)

public boolean equals(Client x) {
if( ( x!=null) && ( x.getClass() == Client.class) )
{
return egalite( (Client)x );
}
return false;
}

protected final boolean egalite (Client clt) {
return (this.nom.equals(clt.nom)) && (this.societe.equals(clt.societe));
}

godrik
godrik
Niveau 30
27 octobre 2009 à 15:24:34

_skip, la difference avec vector est uniquement qu'elle n'est pas synchronized ? ou il y a quelque chose de different dans l'implementation ? (Le nom me fait penser a une implementation en liste chaine de tableau de taille fixe.)

iscario
iscario
Niveau 7
27 octobre 2009 à 15:39:14

ok en fait j'ai trouvé mon erreur, je pensais avoir redéfinit equals, mais en fait elle était seulement surchargée.

_skip
_skip
Niveau 10
27 octobre 2009 à 20:12:01

C'était pas un object en paramètre, j'avoue que ça m'a échappé aussi...
Tu peux éviter ce genre de désagrément en mettant l'annotation @Override au dessus de la déclaration de la méthode. En plus ça améliore la lisibilité je trouve.

@godrik
Oui en dehors de la synchronisation ces classes sont grosso-modo équivalentes. Mais utiliser un Vector si un ArrayList suffit, c'est à éviter.

Par ailleurs une synchronisation de ce genre est rarement intéressante car souvent tu souhaiterais locker le temps de plusieurs opérations, par exemple un test sur size suivi d'un ou plusieurs get/add/remove. Or là si tu te contentes de ce que propose Vector avec son lock par opération non seulement c'est pas performant mais en plus tu as déjà un gros risque de race condition entre les appels aux méthodes.

godrik
godrik
Niveau 30
27 octobre 2009 à 20:34:33

La synchronisation sur les objets ne m'ont jamais bien convaincu en java. La plupart du temps ce n'est pas suffisant et ca rajoute un overhead quand tu n'utilises pas de multi-threading.

_skip
_skip
Niveau 10
27 octobre 2009 à 21:00:50

Dans le récent package java.util.concurrent tu as des choses intéressantes, comme les queues synchrones ou les maps concurrentes qui sont des galères à implémenter soi-même.

Pour développer des applications parallèles, java est franchement riche. Quand j'ai migré nos algos vers du C++, ça m'a manqué.

godrik
godrik
Niveau 30
28 octobre 2009 à 16:50:12

(a la relecture du message, je m'apercois que ca ressemble a un troll, mais je le poste quand meme)

Je suis toujours super dubitatifs quand on dit que java est riche. La plupart des outils s'ecrivent tres bien et sont certainement deja ecrit quelques part. 95% de la java doc ce sont des exercices d'etudiant. C'est sur que c'est pratique de ne pas avoir a les ecrire.
Mais j'ai l'impression qu'il manque plein de chose dedans. Par exemple la derniere fois que j'ai regarde, je n'ai pas trouve de tas de fibonacci. Tu trouve un tas classique : PriorityQueue (avec une implementation assez mauvaise qui ne te laisse pas gerer des tas non binaire), mais pas de tas de fibonacci (Ca devrait implementer AbstractQueue et je ne vois rien qui y ressemble).

La queue synchrone ca n'a pas l'air plus complique qu'un moniteur de hoare avec deux files d'attente. C'est sur que les files d'attente proposees par le systeme ne sont en general pas FIFO, mais c'est un exercice classique d'implementer des files d'attente FIFO a partir de file d'attente "aleatoire".
Si tu ne veux pas te faire une file d'attente FIFO, tu t'en sors avec un semaphore par objet dans la liste.

Si j'ai bien compris la map concurrente, c'est juste une map partitionne en x ensembles ou chaque ensemble est protege par un semaphore.

_skip
_skip
Niveau 10
28 octobre 2009 à 19:25:26

C'était des exemples, la map concurrente est intéressante car elle permet de lire simultanément aux insertions de façon cohérente même si celles-ci déclenchent un rehash.

Mais il y a aussi des mécaniques intéressantes comme un threadpool disposant d'une file d'admission limitée qui peut forcer le thread producteur à se joindre aux consommateurs s'il y a bourrage.

Des tas de petites choses tout à fait stables que tu peux utiliser les yeux fermés, crois-moi c'est agréable. Je dis que java est riche parce que quasiment tout ce dont tu peux avoir besoin existe déjà, et le plus souvent en open source.

godrik
godrik
Niveau 30
28 octobre 2009 à 20:41:58

C'est rigolo cette difference de point de vue. Personnellement, java m'interesse pour son cote "write once, run everywhere", mais j'execre completement l'api java que je trouve fouilli et pas riche du tout. L'argument de l'open source est un peu pipeau, je suis sur qu'il y a des lib opensource relativement complete meme en brainfuck (ok, ptet pas en brainfuck).

En meme temps, je m'interesse pas vraiment aux problemes auxquels java repond.

_skip
_skip
Niveau 10
28 octobre 2009 à 21:08:53

Je suis curieux de savoir à quoi tu compares pour dire que ce n'est pas riche...

C'est pas que je défend java parce que ce n'est de loin pas ma techno préférée, cependant je suis obligé de reconnaître ses qualités, et justement ce qui rend java intéressant c'est la multitude de librairies et de modules qui sont à ta disposition (d'ou argument open source).

godrik
godrik
Niveau 30
28 octobre 2009 à 21:49:41

Je pense qu'il n'y a rien de riche dans ce domaine, mais les gens la trouve riche. C'est peut etre la plus riche de toute dans le cote api standard : les python, ruby et compagnie ne sont pas aussi gros que java. Et les C/C++ partent du principe que tu re implementeras ce dont tu as besoin pour coller a ton cas d'utilisation. Mais ca reste tout petit par rapport a ce qui est classique et dont tu as besoin (j'ai besoin) tout le temps:
-des structure dynamique implemente dans des tableaux pour augmenter la coherence des caches
-des iterateurs cache aware sur les tableaux multidimentionnel
-Des arbres de recherche pas binaire
-des generateurs aleatoires de loi arbitraire
-des outils de graphes
...

C'est pas que c'est difficile a trouver ou a implementer: Ca fait 30 ans que c'est ecrit par tous les etudiants en informatique du monde.

C'est juste que ca me fait marrer que les gens trouver java fourni en fonctionnalite alors que des que tu as besoin d'un truc plus complique qu'une liste chaine, il faut aller le chercher dans un paquet externe ou le reecrire.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment