J'ai un problème , j'arrive pas à trouver le bon chemin pour créer une méthode equals qui compare deux piles de liste en chaînée, voici ma classe :
import java.util.Arrays;
import java.util.Stack;
import tp3.question1.PilePleineException;
import tp3.question1.PileVideException;
public class Pile4 implements PileI, Cloneable {
/** la liste des Maillons/Elements */
private Maillon stk;
/** la capacité de la pile */
private int capacite;
/** le nombre */
private int nombre;
/**
* Classe interne "statique" contenant chaque élément de la chaine c'est une
* proposition, vous pouvez l'ignorer !
*/
private static class Maillon implements Cloneable {
private Object element;
private Maillon suivant;
public Maillon(Object element, Maillon suivant) {
this.element = element;
this.suivant = suivant;
}
public Maillon suivant() {
return this.suivant;
}
public Object element() {
return this.element;
}
public Object clone() throws CloneNotSupportedException {
Maillon m = (Maillon) super.clone();
m.element = element;
return m;
}
public void setSuivant(Maillon suivant){
this.suivant = suivant;
}
}
/**
* Création d'une pile.
*
* @param taille
* la taille de la pile, la taille doit être > 0
*/
public Pile4(int taille) {
if (taille <= 0)
taille = CAPACITE_PAR_DEFAUT;
this.stk = null;
this.capacite = taille;
}
public Pile4() {
this(PileI.CAPACITE_PAR_DEFAUT);
}
public void empiler(Object o) throws PilePleineException {
if (estPleine())
throw new PilePleineException();
Maillon ancienStk = stk;
stk = new Maillon(o, ancienStk);
nombre++;
// à compléter
}
public Object depiler() throws PileVideException {
if (estVide()){
throw new PileVideException();
}else{
Maillon m = this.stk;
this.stk = this.stk.suivant();
nombre--;
return m.element;
}
}
public Object sommet() throws PileVideException {
if (estVide())
throw new PileVideException();
return this.stk.element; // à compléter
}
/**
* Effectue un test de l'état de la pile.
*
* @return vrai si la pile est vide, faux autrement
*/
public boolean estVide() {
return stk == null;
}
/**
* Effectue un test de l'état de la pile.
*
* @return vrai si la pile est pleine, faux autrement
*/
public boolean estPleine() {
return this.capacite == this.taille(); // à compléter
}
/**
* Retourne une représentation en String d'une pile, contenant la
* représentation en String de chaque élément.
*
* @return une représentation en String d'une pile
*/
public String toString() {
String s = "[";
Maillon m =stk;
while(m != null){
s = s + m.element();
m = m.suivant();
if(m != null) s = s + " , ";
}
return s + "]";
}
public boolean equals(Object o) {
if (o instanceof Pile4) {
// à compléter
return false;
}
}
public int capacite() {
return this.capacite;
}
public int hashCode() {
return toString().hashCode();
}
public int taille() {
return nombre;
}
public Object[] toArray() {
return null;
}
}
Bon sinon, sur ta méthode equals il y a (déjà) des choses qui ne vont pas :
if (o instanceof Pile4) {
// à compléter
return true;
}
D'accord c'est à compléter, mais le test est à l'envers de ce qu'il faudrait :
if (!(o instanceof Pile4))
return false;
Pareil pour le test sur les références, il est à l'envers :
if(this == o)
return true;
De plus ce test devrait être fait avant l'autre, de même il y a un autre test qui peut être fait d'abord c'est le cas de null :
if(o == null)
return false;
Quant à la suite, pas besoin de convertir ta liste en tableau, ça n'a pas de sens, il suffit juste de comparer la valeur de
int nombre
et celle de
Maillon stk
.
Remarque : le code suivant est généré automatiquement (par Eclipse), il présuppose que la méthode Maillon a également une méthode equals de redéfinie (ce qui n'est pas le cas).
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Pile4))
return false;
Pile4 other = (Pile4) obj;
if (capacite != other.capacite)
return false;
if (nombre != other.nombre)
return false;
if (stk == null) {
if (other.stk != null)
return false;
} else if (!stk.equals(other.stk)) {
return false;
}
return true;
}
Magnifique, en effet !
Bon sinon, sur ta méthode equals il y a (déjà) des choses qui ne vont pas :
D'accord c'est à compléter, mais le test est à l'envers de ce qu'il faudrait :
Pareil pour le test sur les références, il est à l'envers :
De plus ce test devrait être fait avant l'autre, de même il y a un autre test qui peut être fait d'abord c'est le cas de null :
Quant à la suite, pas besoin de convertir ta liste en tableau, ça n'a pas de sens, il suffit juste de comparer la valeur de et celle de .
Remarque : le code suivant est généré automatiquement (par Eclipse), il présuppose que la méthode Maillon a également une méthode equals de redéfinie (ce qui n'est pas le cas).