Olá pessoal estou com um problema aqui vou tentar explicar da melhor forma possivel:
Eu tenho uma classe que se chama TabelaSalarial e os seguintes atributos dentro dela:
private Long codigo;
private Long idProjeto;
private Long nivel;
private String padrao;
private double acrescimo;
private double valor;
private double valorAjustado;
private double valorHora;
private String cargos;
private String descricaoNivel;
private String amplitude;
até ai tudo ok
só que eu busco do banco varias tabela e jogo dentro de um vetor
TabelaSalarial[] tabelasSalariais = facade.buscarTabelaSalarialsPorFiltros(null, projeto, null, null, null, null, null);
eu estou precisando pegar o maior e o menor “valorAjustado” de cada “Nivel”
com esses campos eu posso gerar a amplitude que é o (Maior/Menor)
Preciso de saber qual é a melhor forma de se fazer isso ou como fazer???
Obrigado a todos
Vc pode usar um HashMap…exemplo
Map<Long, Double> menor = new HashMap<>();
Map<Long, Double> maior = new HashMap<>();
for(TabelaSalarial t : seu_array) {
Double menorArmazenado = menor.get(t.nivel);
if (menorArmazenado > t.valorArmazenado) {
menor.put(l, menorAtual);
}
Double maiorArmazenado = maior.get(t.nivel);
if (maiorArmazenado < t.valorArmazenado) {
maior.put(l, maiorAtual);
}
}
Giulliano obrigado pela colaboração
Map<Long, Double> menor = new HashMap<Long, Double>();
Map<Long, Double> maior= new HashMap<Long, Double>();
for(TabelaSalarial t : seu_array) {
Double menorArmazenado = menor.get(t.nivel); \\nessa linha ele pega um valor Null e me retorna erro
if (menorArmazenado > t.valorArmazenado) {
menor.put(l, menorAtual); \\passei o nivel como o Long
}
Double maiorArmazenado = maior.get(t.nivel);
if (maiorArmazenado < t.valorArmazenado) {
maior.put(l, maiorAtual); \\passei o nivel como o Long
}
}
Ele esta me dando um erro mesmo eu possuindo dados
Ele busca os valore e me retorna Null vc faz idei do que possa ser?
o codigo está assim
Map<Long, Double> menor = new HashMap<Long, Double>();
Map<Long, Double> maior= new HashMap<Long, Double>();
for(TabelaSalarial t : tabelasSalariais) {
Double menorArmazenado = menor.get(t.getValorAjustado());
if (menorArmazenado > t.getValorAjustado()) {
menor.put(t.getNivel(), menorAtual);
}
Double maiorArmazenado = maior.get(t.getValorAjustado());
if (maiorArmazenado < t.getValorAjustado()) {
maior.put(t.getNivel(), maiorAtual);
}
}
onde o valor ajustado é o salario que eu preciso do maior e do menor por nivel
Obrigado!
Vou lhe mandar um exemplo de como você pode fazer, usando apenas o valorajustado… sem usar a parte de nível… você pode melhorar a lógica disto e usar…
classe Main
import java.util.ArrayList;
import java.util.List;
public class main {
/**
* @param args
*/
public static void main(String[] args) {
// vamos supor que você faz uma consultar no banco, e retorne então um
// ArrayList d objetos..
// prefiro trabalhar desta forma, então é assim que vou lhe passar
// list do java.util declarada para TabelaSalarial..
// você pode ter a lista do tipo que você quiser, só precisa declarar..
List<TabelaSalarial> tabela = new ArrayList<TabelaSalarial>();
// declarando alguns objetos, somente para usarmos dentor da lista..
// para exemplo.. você preenchera esta lista de forma diferente..
TabelaSalarial salario1 = new TabelaSalarial();
salario1.setValorAjustado(4.0);
TabelaSalarial salario2 = new TabelaSalarial();
salario2.setValorAjustado(4.0);
TabelaSalarial salario3 = new TabelaSalarial();
salario3.setValorAjustado(9.0);
// adicionando na lista.
tabela.add(salario1);
tabela.add(salario2);
tabela.add(salario3);
// dentro da classes tabelasalarial está a função, então no caso tanto
// faz qual tabela eu passar
// para usarmos a função.. pois eu estou mandando a lista de onde ele
// vai pegar..
System.out.println(salario1.retornaMaior(tabela).getValorAjustado());
System.out.println(salario1.retornaMenor(tabela).getValorAjustado());
}
}
classe tabelasalarial
import java.util.List;
public class TabelaSalarial {
private Long codigo;
private Long idProjeto;
private Long nivel;
private String padrao;
private double acrescimo;
private double valor;
private double valorAjustado;
private double valorHora;
private String cargos;
private String descricaoNivel;
private String amplitude;
public Long getCodigo() {
return codigo;
}
public void setCodigo(Long codigo) {
this.codigo = codigo;
}
public Long getIdProjeto() {
return idProjeto;
}
public void setIdProjeto(Long idProjeto) {
this.idProjeto = idProjeto;
}
public Long getNivel() {
return nivel;
}
public void setNivel(Long nivel) {
this.nivel = nivel;
}
public String getPadrao() {
return padrao;
}
public void setPadrao(String padrao) {
this.padrao = padrao;
}
public double getAcrescimo() {
return acrescimo;
}
public void setAcrescimo(double acrescimo) {
this.acrescimo = acrescimo;
}
public double getValor() {
return valor;
}
public void setValor(double valor) {
this.valor = valor;
}
public double getValorAjustado() {
return valorAjustado;
}
public void setValorAjustado(double valorAjustado) {
this.valorAjustado = valorAjustado;
}
public double getValorHora() {
return valorHora;
}
public void setValorHora(double valorHora) {
this.valorHora = valorHora;
}
public String getCargos() {
return cargos;
}
public void setCargos(String cargos) {
this.cargos = cargos;
}
public String getDescricaoNivel() {
return descricaoNivel;
}
public void setDescricaoNivel(String descricaoNivel) {
this.descricaoNivel = descricaoNivel;
}
public String getAmplitude() {
return amplitude;
}
public void setAmplitude(String amplitude) {
this.amplitude = amplitude;
}
// funcao que recebe a list de tabelas salariais, e retorna o objeto
// que contém o maior valorajustado..
// pegando todo o objeto, pode pegar o codigo dele, cargo,etc..
public TabelaSalarial retornaMaior(List<TabelaSalarial> tabela) {
TabelaSalarial maior = new TabelaSalarial();
// declarando q o primeiro/onde vai começar a comparar é o primeiro da
// list.
// não estou testando aki se a tabela está cheia ou não, e nem se o
// valor é valido (!= de null);
// fazendo bem simples pra você pegar a lógica
maior = tabela.get(0);
// for para percorrer a lista
for (TabelaSalarial ts : tabela) {
// se encontra um maior ou igual, mudar substitui o objeto que vai
// retornar.
if (ts.getValorAjustado() >= maior.getValorAjustado())
maior = ts;
}
return maior;
}
// funcao que recebe a list de tabelas salariais, e retorna o objeto
// que contém o menor valorajustado..
// pegando todo o objeto, pode pegar o codigo dele, cargo,etc..
public TabelaSalarial retornaMenor(List<TabelaSalarial> tabela) {
TabelaSalarial menor = new TabelaSalarial();
// declarando q o primeiro/onde vai começar a comparar é o primeiro da
// list.
// não estou testando aki se a tabela está cheia ou não, e nem se o
// valor é valido (!= de null);
// fazendo bem simples pra você pegar a lógica
menor = tabela.get(0);
// for para percorrer a lista
for (TabelaSalarial ts : tabela) {
// se encontra um menor ou igual, mudar substitui o objeto que vai
// retornar.
if (ts.getValorAjustado() <= menor.getValorAjustado())
menor = ts;
}
return menor;
}
}
saida:
[quote]9.0
4.0[/quote]
espero que ajude pelo menos com a lógica…
abraço!
clarel.filho muito obrigado por sua explicação
porém debuguei esse codigo e occorreu o seguinte ele realmente pega o maior e o menor porem ele pega o maior e o menor de todas as tabelas e eu preciso por nivel!
Voce faz ideia de como implementar?
Novamente obrigado pela atenção!
Projeto projetoSessao = (Projeto)request.getSession().getAttribute("projetoSessao");
Long projeto = projetoSessao.getCodigo();
TabelaSalarial[] tabelasSalariais = facade.buscarTabelaSalarialsPorFiltros(null, projeto, null, null, null, null, null);
TabelaSalarialPrint tabelaSalarial;
ArrayList tabelaPrint = new ArrayList ();
List<TabelaSalarialPrint> tabela = new ArrayList<TabelaSalarialPrint>();
for (int i = 0; i < tabelasSalariais.length; i++){
tabelaSalarial = new TabelaSalarialPrint();
tabelaSalarial.setNivel(tabelasSalariais[i].getNivel());
tabelaSalarial.setPadrao(tabelasSalariais[i].getPadrao().toString());
if (tabelasSalariais[i].getValorAjustado() > 0){
tabelaSalarial.setValorAjustado(tabelasSalariais[i].getValorAjustado());
}
else if(tabelasSalariais[i].getValor() > 0){
tabelaSalarial.setValorAjustado(tabelasSalariais[i].getValor());
}
else{
tabelaSalarial.setValorAjustado(0.0);
}
tabela.add(tabelaSalarial);
double maior=tabelaSalarial.retornaMaior(tabela).getValorAjustado();
double menor=tabelaSalarial.retornaMenor(tabela).getValorAjustado();
tabelasSalariais[i].setAmplitude(maior/menor);
tabelaPrint.add(tabelaSalarial);
}
Cara, você pode retornar uma lista então…
e dentro do método, fazer uma lógica que percorra a lista que enviou… separa ela por niveis… e após isto retorne a lista com o maior e menor de kda nivel…
OOOU
deixe a função como está, mas inves de mandar a lista com todos…
já manda a lista separada por níveis… ai já é meio caminho andado!
Abraço