EDIT : ah mince attendez, je crois que j'ai trouvé... C'est un TreeSet que je remplis et pas une ArrayList '-_- ...
Bonjour à tous,
Je travaille sur des objets que j'ai appelés Pattern. J'ai le constructeur suivant (qui met dans une ArrayList<Pattern> tous les Pattern de <patterns> qui ne sont pas <p_arg>) :
J'obtiens régulièrement des sorties étranges telles que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 private SortedPatternNeighbors(ArrayList<Pattern> patterns, Pattern p_arg){ p = p_arg; for(int i = 0 ; i < patterns.size() ; i++){ Pattern pi = patterns.get(i); if(pi != p){ int avant = patternNeighbors.size(); boolean al_return = patternNeighbors.add(pi); boolean pi_null = pi == null int apres = patternNeighbors.size(); System.out.println("iteration " + i + " : " + avant + "-" + apres + " : " + al_return + " : " + pi_null); } else System.out.println("iteration " + i + " : identique"); } }
Ici, l'élément 0 est égal à <p_arg> donc on ne fait rien.iteration 0 : identique
iteration 1 : 0-1 : true : false
iteration 2 : 1-2 : true : false
iteration 3 : 2-2 : false : false
Les Pattern 1 et 2 sont ajoutés et la taille de l'ArrayList augmente donc. En revanche le problème vient de l'itération 3. On passe bien par la méthode add mais la taille de l'ArrayList reste à 2.
Je ne comprend vraiment pas pourquoi la taille de l'ArrayList reste la même. L'objet n'est pas null, il n'est pas égal à un Pattern précédemment ajouté (je n'ai pas non plus redéfini la fonction equals de Pattern qui pourrait justifier qu'il le considère comme identique à un autre précedemment ajouté).
Dans la doc, il est pourtant écrit que, dans ce cas, une exception devrait être lancée :
Pourriez-vous m'éclairer ? Pourquoi la méthode add renvoie false dans le dernier cas ?If a collection refuses to add a particular element for any reason other than that it already contains the element, it must throw an exception (rather than returning false). This preserves the invariant that a collection always contains the specified element after this call returns.
Merci d'avance !
Partager