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>) :
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");
			}
		}
J'obtiens régulièrement des sorties étranges telles que :
iteration 0 : identique
iteration 1 : 0-1 : true : false
iteration 2 : 1-2 : true : false
iteration 3 : 2-2 : false : false
Ici, l'élément 0 est égal à <p_arg> donc on ne fait rien.
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 :
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.
Pourriez-vous m'éclairer ? Pourquoi la méthode add renvoie false dans le dernier cas ?

Merci d'avance !