Friday 8 September 2017

Java Moving Average Queue


Eu preciso acompanhar os últimos 7 dias de trabalho em um loop de leitura de arquivos planos. Seu ser usado para medir fatigueability de rosters de trabalho. Agora eu tenho algo que funciona, mas parece bastante detalhado e não tenho certeza se há um padrão que é mais sucinto. Atualmente, eu tenho uma classe Java com uma matriz estática para armazenar os últimos dados dias x, então como eu leio através do arquivo, eu cortar o primeiro elemento e mover os outros 6 (por uma semana rodando total) de volta por um. O processamento dessa matriz estática é feito em seu próprio método ie. Minha pergunta: esta é uma abordagem de design razoável, ou há algo de cegueira óbvia e simples para fazer esta tarefa Obrigado rapazes pediu Aug 30 11 at 14:33 Thanks alot guys: I39ve tem a mensagem: use um objeto de nível mais alto e explorar o Métodos relevantes ou um tampão circular. Grandes respostas, todas elas. Quando você pensa sobre isso, você sempre precisa de acesso a toda a matriz para que você possa se livrar da primeira entrada - que eu wasn39t 100 certeza de no meu próprio. I39m aliviado que eu hadn39t perdeu um forro 1 e foi basicamente em uma pista razoável, se não eficiente e concisa Isso é o que eu adoro sobre este site: de alta qualidade, respostas relevantes de pessoas que sabem o seu sht. Ndash Pete855217 Aug 30 11 at 15:05 Por que você inicializar runningTotal para null Qual é o seu tipo Onde é declarado Faria bem se você colocar alguns exemplos de código que se assemelham ao código Java real. Seguindo em frente, minha crítica seria a seguinte: a sua função faz muito. Uma função ou método deve ser coeso. Mais apropriadamente, eles deveriam fazer uma coisa e uma coisa só. Pior ainda, o que acontece no seu loop for quando x 5 Você copia runningTotal6 em runningTotal5. Mas então você tem duas cópias do mesmo valor na posição 5 e 6. Em seu projeto, sua função movesshuffles os itens em sua matriz calcula o total imprime coisas para erro padrão retorna o total Ele faz muito. Minha primeira sugestão é não mover coisas ao redor da matriz. Em vez disso, implementar um buffer circular e usá-lo em vez da matriz. Simplificará seu projeto. Minha segunda sugestão é dividir as coisas em funções que são coesas: ter uma estrutura de dados (um buffer circular) que permite adicionar a ele (e que descarta a entrada mais antiga sempre que atingir sua capacidade.) Ter a estrutura de dados implementar um Interator tem uma função que calcula o total no iterador (você não se importa se você está calculando o total de uma matriz, lista ou bufer circular.) Não chamá-lo total. Chamá-lo de soma, que é o que você está computando. Isso é o que fazer :) That39s grande informação luis, no entanto lembre-se esta função é uma pequena parte da funcionalidade da classe, e seria exagero para adicionar muito código para torná-lo perfeito. Você está tecnicamente correto, e eu entendo que meu código faz muito 39, mas ao mesmo tempo às vezes é melhor errar do lado do código menor, mais claro do que ir para a perfeição. Dado o meu Java habilidades, mesmo fazendo o pseudocódigo que você descreve compilação teria me golpe meu orçamento sobre este (), mas obrigado pela descrição clara. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, não é sobre a perfeição, mas sobre as práticas industriais estabelecidas que temos conhecimento para as últimas 3 décadas. Código limpo é sempre um que é particionado. Temos décadas de evidências que indicam que este é o caminho a percorrer no caso geral (em termos de custo-eficiência, redução de defeitos, compreensão, etc.). A menos que seja um código descartável para um tipo único de coisa. Nunca é custoso fazer isso quando se inicia qualquer análise de problemas desta maneira. Codificação 101, quebrar o problema eo código segue, nem overkill nem difícil) ndash luis. espinal Aug 31 11 at 15:55 Sua tarefa é muito simples ea abordagem que você adotou é certamente bom para o trabalho. No entanto, se você quiser usar um design melhor, você deve se livrar de todo esse movimento número você melhor usar uma fila FIFO e fazer bom uso de push e pop métodos que forma o código não vai refletir qualquer movimento de dados, apenas as duas ações lógicas De novos dados e remover dados com mais de 7 dias. Eu tenho um programa de datalogging científico que eu tenho desenvolvido por um número de anos agora. Agora precisamos adicionar alguma funcionalidade para que produza uma média móvel dos dados coletados. Eu posso criar uma fila de myDataClass para fazer o buffer de fifo, mas eu queria saber o que a melhor maneira de fazer a média pode ser. Como você pode ver a partir do exemplo de código abaixo, myDataClass contém várias estruturas de dados, algumas das quais podem ser calculadas e algumas que não podem (por exemplo, a string). A principal questão é saber se existe uma maneira fácil de conseguir isso ou preciso escrever código para cada item dentro da classe myDataClass ou devo redesenhar myDataClass Obrigado. Terça-feira, 12 de julho de 2011 9:14 Personnaly, eu criaria uma classe quotDataQueue (de MyDataClass) que dequeue se a contagem na fila passar 10 itens. Desta forma, você nunca terá que cuidar do número de itens na fila do seu código, isso será cuidar de dentro da classe de fila Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 13:56 Terça-feira, julho 12, 2011 9:40 AM Depois de um pouco mais de investigação, acho que encontrei a solução para você. Você pode usar o método CopyTo para copiar os itens à esquerda na fila para uma matriz. Esteja ciente de que eu não calcular a média, eu só mostrou como você pode obter a base de seus cálculos, mas que é apenas adicionar seus próprios cálculos baseados em torno de sua regra de negócios para isso. Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 13:56 sexta-feira, 15 de julho de 2011 5:16 Baseado na minha compreensão, sua exigência é algo como isto: Este é os dados na fila: myDataClass1. Dataadbl 2.1 datastr quotsomeString1quot dataarraydbl uma matriz dupla myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl uma matriz dupla myDataClass10. Dataadbl 9.1 datastr quotsomeString10quot dataarraydbl uma matriz dupla Agora, você deseja calcular o número médio de feeds datadbl em cada objeto myDataClass e obter o número médio de dataground. Se assim for, eu sugiro que você faça a mesma coisa que Crazypenie sugeriu: construir uma nova classe chamada DataQueue: Espero que isso seja útil, se eu tiver entendido mal qualquer coisa, sinta-se livre para me informar. Mike Feng MSFT MSDN Suporte da comunidade Feedback para nós Obtenha ou solicite um exemplo de código da Microsoft Lembre-se de marcar as respostas como respostas se elas ajudarem e desmarcarem se não fornecerem nenhuma ajuda. Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 13:55 sexta-feira, 15 de julho de 2011 03:33 Graças Cor, eu poderia fazê-lo assim, mas myDataClass é realmente muito grande eo sistema de log pode ser executado para Um longo tempo por isso é mais eficiente para mim lixo cópias da classe que eu realmente não precisa para calcular a média. A fila parecia a maneira mais fácil de conseguir isso. Minha principal questão é, como é que a média de uma classe como esta estou recebendo a sensação de que eu vou precisar para escrever o código que faz isso especificamente para cada tipo de dados no myDataClass. Classe pública myDataClass Terça-feira, julho 12, 2011 10:40 AM Baseado na minha compreensão, sua exigência é algo como isto: Este é os dados na fila: myDataClass1. Dataadbl 2.1 datastr quotsomeString1quot dataarraydbl uma matriz dupla myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl uma matriz dupla myDataClass10. Dataadbl 9.1 datastr quotsomeString10quot dataarraydbl uma matriz dupla Agora, você deseja calcular o número médio de feeds datadbl em cada objeto myDataClass e obter o número médio de dataground. Se assim for, eu sugiro que você faça a mesma coisa que Crazypenie sugeriu: construir uma nova classe chamada DataQueue: Espero que isso seja útil, se eu tiver entendido mal qualquer coisa, sinta-se livre para me informar. Mike Feng MSFT MSDN Suporte da comunidade Feedback para nós Obtenha ou solicite um exemplo de código da Microsoft Lembre-se de marcar as respostas como respostas se elas ajudarem e desmarcarem se não fornecerem nenhuma ajuda. Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 13:55 sexta-feira, 15 de julho de 2011 3:33 AMgetMaxQueueLength Retorna o número máximo de tuplas que essa fila já viu. Retorna: número máximo de tuplas que essa fila pode conter getCurrentQueueLength Retorna o número aproximado de tuplas atualmente nesta fila. Esse número é aproximado, pois pode haver vários segmentos acessando a fila ao mesmo tempo. Retorna: o número aproximado de tuplas atualmente na fila getBatchProcessingTime Retorna a média móvel da quantidade de tempo (microsegundos) necessária para processar um lote de tuplas. Retorna: quantidade de tempo (microsegundos) que leva para processar um lote de tuplas Desde: 6.3.10 getBatchLatency Retorna uma média móvel do tempo (microsegundos) para um lote de tuplas para percorrer a fila Retorna: quantidade de tempo (microsegundos) Para um lote de tuplas para percorrer a fila Desde: 6.3.10 getBatchSize Retorna uma média móvel do tamanho de um lote de tuplas Retorna: Retorna uma média móvel do tamanho de um lote de tuplas Desde: 6.6.13 Retorna o nome de Esta fila. Para filas entre módulos o nome será o nome do fluxo que está sendo enfileirado em. Para filas entre recipientes o nome será o nome da conexão container. Much versão mais simples: public class MovingAverageInSlidingWIndow int windowsize Fila fila int soma pública MovingAverageInSlidingWIndow (int windowsize) this. windowsize windowsize this. queue novo LinkedList () this. sum 0 Localiza a média móvel após inserir o item n no fluxo de dados private double findMovingAverage (int n) se (queue. size () gt windowsize - 1) soma sum - queue. poll () queue. offer (n) soma soma n retorno (duplo) Sum queue. size () public static void principal (String args) int windowsize 3 MovingAverageInSlidingWIndow m novo MovingAverageInSlidingWIndow (windowsize) para (int i 1 i lt 20 i) System. out. println (quotAfter Adicionando quot i quot para a fila: Média É: quot m. findMovingAverage (i)) Podemos simplesmente persistir a soma atual de elementos na fila na variável global. Assim, reduzindo a computação no método next (). Public class MovingAverage LinkedList fila int size int sum 0 mantém sum a fila Inicialize sua estrutura de dados aqui. Public MovingAverage (int size) this. queue novo LinkedList () this. size tamanho public double next (int val) queue. offer (val) soma val if (queue. size () gtthis. size) sum - queue. poll ()

No comments:

Post a Comment