Liste chainée

Fermé
sahlai Messages postés 2 Date d'inscription lundi 26 octobre 2015 Statut Membre Dernière intervention 26 octobre 2015 - 26 oct. 2015 à 00:40
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 26 oct. 2015 à 18:42
Bonsoir,

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;
	}
}


J'attends vos réponses et merci .
A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
26 oct. 2015 à 06:38
Bonjour,

	public boolean equals(Object o) {
		if (o instanceof Pile4) {
			// à compléter		
			return false;
		}
	
	}

En fait tu n'as même pas essayé de faire quoi que ce soit...
1
sahlai Messages postés 2 Date d'inscription lundi 26 octobre 2015 Statut Membre Dernière intervention 26 octobre 2015
26 oct. 2015 à 09:35
Mais non j'essayé pas mal de fois et même j'ai crée une méthode toArray

public boolean equals(Object o) {
		if (o instanceof Pile4) {
			// à compléter		
			return true;
		}
		if(this != o){
			return false;
		}
		 PileI p = (PileI) o;		 
		return this.taille() == p.taille() && Arrays.equals(this.toArray(), p.toArray());
	}


public Object[] toArray() {
		
		return null; //???
	}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
26 oct. 2015 à 18:42
"et même j'ai crée une méthode toArray"

 	public Object[] toArray() {		
		return null; //???
	}

Magnifique, en effet !

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;
}
0