2017-09-29 6 views
0

Pour préface, j'ai cherché de nombreux exemples avant de demander et ne trouve pas de solution en ce qui concerne mon problème. J'essaye d'implémenter une file d'attente générique dans un programme que je fais, mais bloqué à un certain point. Le programme que j'ai fait est supposé simuler une imprimante, mise en file d'attente avec des travaux d'impression. Il existe une classe de file d'attente, une classe PrintQueue et une classe de travail. (Il est important de noter que la classe Job se compose d'un ID de travail et d'une chaîne de caractères qui l'a ordonnée). J'ai inclus une fonction (dans la classe printQueue) où si le premier travail correspond à l'ID du travail que vous avez entré, il sera supprimé.Surcharge générique équals méthode

Malheureusement, la file d'attente est générique. Cela signifie que je ne peux pas traverser le tableau avec juste un entier pour vérifier l'égalité car il s'agit d'une file d'attente d'objets de travail. Pour résoudre ce problème, je crée un travail avec un nom vide et un identifiant normal. La classe Job a une méthode égale, qui détermine si l'ID ou le propriétaire correspond, alors c'est vrai. Mais quand j'exécute le code, cette classe n'est pas appelée. La classe générique égale est appelée à la place, ce qui sera bien sûr faux. Après avoir regardé de nombreux exemples sur ce site, j'ai essayé toutes les solutions recommandées, ce qui n'a pas fonctionné pour moi car mon cas (et mon problème) sont différents. Que puis-je faire pour remplacer la méthode générique égale? Mon code ci-dessous est aussi simple que je pourrais le faire pour reproduire ce problème tout en gardant le contexte.

EMPLOI CLASSE

public class Job{ 
    private String owner; 
    private int jobId; 

    public Job(String o, int j){ 
     owner = o; 
     jobId = j; 
    } 
    public String getOwner(){ 
     return owner; 
    } 
    public int getJobId(){ 
     return jobId; 
    } 
    public String toString() { 
     return owner + " " + jobId + ". "; 
    } 

    public boolean equals(Job a) { 
     if(this.jobId == a.getJobId() || this.owner.equals(a.getOwner())) { 
      return true; 
     } 
     else 
      System.out.println("nomatch"); 
      return false; 
    } 
} 

GÉNÉRIQUE QUEUE CLASSE

import java.util.ArrayList; 
    public class Queue<T>{ 
    private ArrayList<T> queue; 
    public Queue() { 
     queue = new ArrayList<T>(); 
    } 
    public void enQueue(T obj1) { 
     queue.add(obj1); 
    } 
    public T deQueue() { 
     if(queue.size() != 0) { 
      T temp = queue.get(queue.size() - 1); 
      queue.remove(queue.size() -1); 
      return temp; 
     } 
     else 
      return null; 
    } 
    public int size() { 
     return queue.size(); 
    } 
    public boolean isEmpty() { 
     if (size() == 0) { 
      return true; 
     } 
     else 
      return false; 
    } 
    public int positionOf(T a) { 
     for(int x = 0; x < queue.size(); x++) { 
      if(a.equals(queue.get(x))) { 
       System.out.println("Positionmatch"); 
       return x; 
      } 
     } 
     return -1; 
    } 
} 

printQueue CLASSE

public class PrintQueue { 
    Queue<Job> prqueue = new Queue<Job>(); 
    public PrintQueue() {} 

    public void lprm(int jobID) { //Removes the active job at the front of the queue if jobId matches, error message otherwise 
     //I can't JUST use jobID to check the position because the queue is a collection of JOBS not JobId's 
     if (prqueue.positionOf(new Job("",jobID))==0) { 
      prqueue.deQueue(); 
     } 
     else if (prqueue.positionOf(new Job("",jobID))== -1) { 
      System.out.println("Job does not occupy first row."); 
     } 
    } 
} 

Je sais que ce C'est une question vaste, donc si vous prenez le temps de le lire merci beaucoup. Je ne le demanderais pas si je pouvais trouver la réponse ailleurs.

+0

lorsque vous substituez vous devez remplacer égale aussi la méthode –

+1

** Vous êtes pas ** hashCode() remplaçant les égaux méthodes dans votre classe Job. La signature de méthode correcte est 'public boolean equals (Object obj)'. Il doit prendre un objet en paramètre. Si vous aviez utilisé l'annotation @Override, vous auriez probablement repéré cette erreur par vous-même. –

+0

J'avais utilisé @Override mais je suppose que je n'ai pas compris le message d'erreur. Merci –

Répondre

1

La solution est simple: vous n'êtes pas prioritaire sur votre classe, erreur commune. Annotez toujours vos méthodes avec @Override pour éviter cette erreur.

véritable méthode equals prend un paramètre Object, et le vôtre a un Job comme paramètre, changement qui à Object puis jeté en conséquence.

Si vous utilisez IDE, je suggère right click -> source -> generate equals et vous verrez un bon exemple comment le faire.

+0

Réponse géniale et encore meilleure façon de me faire comprendre, merci beaucoup! –

+0

Je ne peux pas donner de réponse parce que je ne suis pas encore assez haut.Pardon! –

0

Vous devez remplacer vos méthodes comme celui-ci

@Override 
public boolean equals(Object a) { 
    if(!(a instanceof Job)) 
     throw new IllegalArgumentException(); 
    Job job =(Job)a; 
    if(this.jobId == job.getJobId() || this.owner.equals(job.getOwner())) { 
     return true; 
    } 
    else 
     System.out.println("nomatch"); 
    return false; 
} 

Voir aussi Why do I need to override the equals and hashCode methods in Java?

+0

Cela pourrait être un commentaire. Et aussi le lien que vous avez donné ne fonctionne pas. – procrastinator

+0

Merci, j'ai corrigé le lien –

+0

Je n'aurais jamais pensé faire l'objet alors à la coulée. Merci de votre aide! –