Calcular tempo em que um Objeto permanece na Fila

5 respostas
F
Implementei todos os métodos de uma fila com controle de prioridades, porém meu professor quer que eu crie uma central de impressão que informe o seguinte:

1 - Informar os clientes que ainda estão na fila (feito);

2 - Calcular o tempo em que o cliente(Objeto) fica na fila. Caso passe de 15s, o banco pagará uma multa de R$1000,00. Obs:Quer que utilize System.currentTimeMillis() para cálculo do tempo.

3 - Informar os clientes que  foram atendidos e o tempo gasto em cada um;

4 - Exibir a quantidade e o total de multa diária que o banco deve pagar.

Obs: Não estou usando vetor, array…, é uma fila de NoPrioridade (Classe que implementa as variáveis).

Para armazenar os clientes atendidos, estou pensando em criar um vetor para guardar o nome do cliente e o tempo gasto no atendimento. O que acham?
Mas a principal dúvida é: como calcular o tempo gasto em cada atendimento?
Caso julguem necessário posto o código do programa.

5 Respostas

pfk66

Você pode obter o tempo decorrido entre dois objetos Date, ou entre um Date e o tempo atual, com uma simples subtração.

System.currentTimeMillis() - date.getTime()

D

Olá

Não sei como está implementado a sua fila, mas espero que seja mais ou menos assim:

classe NoPrioridade
    Cliente cliente;
    NoPrioridade proximo; //  proximo da fila

Sugiro que crie uma classe cliente ou algo similar.

classe Cliente
    String nome;
    long instanteDeEntrada = -1;
    long instanteDeSaida = -1;

Quando o cliente entrar na fila, o valor do instanteDeEntrada deve receber o valor System.currentTimeMillis() e quando sair da fila o valor do instanteDeSaida deve receber o System.currentTimeMillis().

Para calcular o tempo que ficou na fila, basta fazer a diferença entre o instanteDeSaida com o instanteDeEntrada e converter para segundos (dividir por mil) e para calcular o tempo que está na fila, calcule a diferença do tempo atual (System.currentTimeMillis()) com o instanteDeEntrada.

F

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

}

F

Acabei de verificar uma coisa que havia feito errado. No método controlaTempo da classe FilaDePrioridades estou pegando o tempo inicial e final do objeto criado dentro da própria classe, onde eu deveria estar pegando dos objetos que foram enfileirados e instanciados. Estou na dúvida de como pegar os tempos guardados em cada nó.

F

Cara consegui calcular o tempo que cada cliente permanece na fila. Eu já havia setado o tempo na entrada do nó na fila e na saída do nó da fila. No início estava com dúvida de onde colocar e depois de como recuperar estes dados, depois que vi a sugestão de vocês, a lâmpada apareceu aqui de como eu poderia fazer isso. Muito Obrigado pela ajuda de vocês.

Criado 27 de maio de 2016
Ultima resposta 27 de mai. de 2016
Respostas 5
Participantes 3