A estrutura é a seguinte:
Tenho as classes Gestante, Idoso, CaixaRapido, CaixaNormal e Furao que herdam da classe Operacao.
Existe composição entre a classe Operacao e a classe NoPrioridade.
Segue código das classes FilaDePrioridades e NoPrioridade.
package trabalho;
import interfaces.Fila;
import interfaces.Imprimivel;
import javax.swing.JOptionPane;
import excecoes.*;
public class FilaDePrioridades implements Fila, Imprimivel{
NoPrioridade frente, cauda;
int tamanho,pos;
private NoPrioridade[] array;
public FilaDePrioridades() {
frente = new NoPrioridade(cauda, null, null);
frente.setPrioridade(0);
cauda = new NoPrioridade(null, frente, null);
cauda.setPrioridade(6);
tamanho = 0;
pos = 0;
array = new NoPrioridade[1];
}
public void enfileirar(Operacao op) {
try{
NoPrioridade novoNo = new NoPrioridade(null, null, op);
if (op.getClass() == Gestante.class) {
novoNo.setPrioridade(1);
}
if (op.getClass() == Idoso.class) {
novoNo.setPrioridade(2);
}
if (op.getClass() == CaixaRapido.class) {
novoNo.setPrioridade(3);
}
if (op.getClass() == CaixaNormal.class) {
novoNo.setPrioridade(4);
}
if (op.getClass() == Furao.class) {
throw new FuraoException("Furar fila é antiético");
}
if (isEmpty()){
novoNo.setNext(cauda);
novoNo.setPrev(frente);
cauda.getPrev().setNext(novoNo);
cauda.setPrev(novoNo);
novoNo.setTempoIni(System.currentTimeMillis());
tamanho++;
}else{
NoPrioridade noAux = frente;
boolean aux = true;
while (aux){
if(novoNo.getPrioridade() < noAux.getNext().getPrioridade()){
novoNo.setNext(noAux.getNext());
novoNo.setPrev(noAux);
noAux.setNext(novoNo);
noAux.getNext().setPrev(novoNo);
novoNo.setTempoIni(System.currentTimeMillis());
tamanho++;
aux = false;
}else{
noAux = noAux.getNext();
}
}
}
}catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE, null);
}
}
public Operacao desenfileirar() {
try {
if (isEmpty()) {
throw new FilaVaziaException("Fila vazia!");
} else {
NoPrioridade aux = frente.getNext();
guardaClientesAtend(aux);
aux.setTempoFim(System.currentTimeMillis());
frente.getNext().getNext().setPrev(frente);
frente.setNext(frente.getNext().getNext());
tamanho--;
return aux.getOperacao();
}
} catch (FilaVaziaException e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE, null);
return null;
}
}
public void controlaTempo(){
NoPrioridade n = new NoPrioridade(null, null, null);
System.out.println(n.getTempoIni());
System.out.println(n.getTempoFim());
}
private void dobrarArray() {
NoPrioridade[] arrayDobrado = new NoPrioridade[array.length + 1];
for (int i = 0; i < array.length; i++) {
arrayDobrado[i] = array[i];
}
array = arrayDobrado;
}
public void guardaClientesAtend(NoPrioridade ope){
if (pos == array.length) {
dobrarArray();
}
array[pos] = ope;
pos++;
}
public Operacao frente() {
try {
return frente.getNext().getOperacao();
} catch (NullPointerException e) {
return null;
}
}
public Operacao ultimo(){
try {
return cauda.getPrev().getOperacao();
} catch (NullPointerException e) {
return null;
}
}
public int size() {
return tamanho;
}
public boolean isEmpty() {
return tamanho == 0;
}
public void imprimir() {
NoPrioridade aux = frente.getNext();
System.out.println("Fila de Clientes a atender");
while(aux != cauda){
System.out.print(aux.getOperacao().getNome()+ " (" + aux.getPrioridade() + "), ");
aux = aux.getNext();
}System.out.println();
}
public void imprimirClientesAtendidos(){
System.out.println("Clientes que já foram atendidos");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i].getOperacao().getNome() + " (" + array[i].getPrioridade() + "), ");
}System.out.println();
}
}
package trabalho;
public class NoPrioridade {
private NoPrioridade next, prev;
private Operacao operacao;
private int prioridade;
private long tempoIni, tempoFim;
public NoPrioridade(NoPrioridade next, NoPrioridade prev,Operacao operacao){
this.next = next;
this.prev = prev;
this.prioridade = prioridade;
this.operacao = operacao;
// this.tempoIni = 0;
// this.tempoFim = 0;
}
public NoPrioridade getNext() {
return next;
}
public void setNext(NoPrioridade next) {
this.next = next;
}
public NoPrioridade getPrev() {
return prev;
}
public void setPrev(NoPrioridade prev) {
this.prev = prev;
}
public Operacao getOperacao() {
return operacao;
}
public void setOperacao(Operacao operacao) {
this.operacao = operacao;
}
public int getPrioridade() {
return prioridade;
}
public void setPrioridade(int prioridade) {
this.prioridade = prioridade;
}
public long getTempoIni() {
return tempoIni;
}
public void setTempoIni(long tempoIni) {
this.tempoIni = tempoIni;
}
public long getTempoFim() {
return tempoFim;
}
public void setTempoFim(long tempoFim) {
this.tempoFim = tempoFim;
}
}