Liste chainée

sahlai Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 19031 Statut Modérateur -
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 .

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
    1. sahlai Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
       
      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
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      "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