Liste chainée [Fermé]

Signaler
Messages postés
2
Date d'inscription
lundi 26 octobre 2015
Statut
Membre
Dernière intervention
26 octobre 2015
-
Messages postés
16163
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 janvier 2021
-
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

Messages postés
16163
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 janvier 2021
2 773
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
2
Date d'inscription
lundi 26 octobre 2015
Statut
Membre
Dernière intervention
26 octobre 2015

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; //???
	}
Messages postés
16163
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 janvier 2021
2 773
"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;
}