Tenho um Objeto (LoginObj) em meu programa que tem a propriedade
private List<TaxaObj> taxas = new ArrayList<TaxaObj>;
Nesse Objeto (TaxaObj) eu tenho as propriedades parcelas e juros que são abastecidos de um xml e Xml é assim:
<parcela valor="2">4</parcela>
<parcela valor="3">6</parcela>
Onde é 4 é o juros da parcela 2, onde é 6 é o juros da parcela 3 e por ai vai…
Tendo isso em mãos, o que preciso é fazer quando o usuario digitar “2” para dividir o valor da venda total colocar o juros “4” por exemplo…
então criei um metodo
public String calcularValorComJuros(int quantidadeDeParcela){
return VendaTotalComJuros;
}
O que eu não estou conseguindo entender, é como acessar a lista de taxas, comparar com a quantidade de parcela digitadas pelo usuario…
Eu queria fazer algo mais dinamico, caso o xml mudasse, por exemplo, amanha o juros da parcela 2 de 4 vai para 6, e o juros da parcela 3 de 6 vai para 8, e assim vai…
Já procurei no google algo que me ajudaria seria o binarySearch, mas não consegui entender direito, e também não sei se vem ao caso…
Alguém pode me ajudar por favor?
Seu problema ainda está meio obscuro. Principalmente na descrição final.
1- Primeiro de tudo, poste seu codigo da classe TaxaObj.
2- Descreva cada ponto do seu problema e ficará mais fácil. Por exemplo, você não consegue acessar o xml? Ou consegue? Gostaria de acessá-lo todos os dias para atualizar algo que estará em memória do sistema? Seu programa é desktop ou web? etc…
Desde já agradeço por tentar me ajudar…
Primeiramente segue o código da minha classe TaxaObj
public class TaxaObj {
private String parcela;
private String juros;
public TaxaObj(){
}
public String getParcela() {
return parcela;
}
public void setParcela(String parcela) {
this.parcela = parcela;
}
public String getJuros() {
return juros;
}
public void setJuros(String juros) {
this.juros = juros;
}
}
O usuario faz o login em minha aplicação, quando isso acontece é recebido um xml com as taxas e juros da parcela
<parcela valor="2">4</parcela>
<parcela valor="3">6</parcela>
Não estou tendo problemas em receber o xml e armazenar na classe TaxaObj onde eu pego esse atributo “valor=2” e armazeno na propriedade parcela do objeto TaxaObj e o “4” armazeno na propriedade juros do objeto TaxaObj…
Eu adicionei um Listener no meu TextInput(Parcelas) para que quando um numero for digitado um numero de parcelas chame o metodo calcularValorComJuros
que esse metodo é dessa forma…
public String calcularValorComJuros(int quantidadeDeParcela){
return VendaTotalComJuros;
}
Ele recebe a quantidade de parcela digita pelo usuario… Isso já funciona na minha aplicação, não tenho problema algum com isso…
Unica dificuldade que estou tendo é pegar essa quantidade de parcela digitada pelo usuario verificar o juros na propriedade juros do meu objeto TaxaObj, verificar também a parcela e fazer um calculo… o calculo também não vou ter problema se conseguir acessar os valores certos
algo em torno de
public String calcularValorComJuros(int quantidadeDeParcela){
foreach(TaxaObj taxa : taxas){
if(taxa.getParcela().equals(String.valueOf(quantidadeDeParcela){
"Faz o calculo do juros da parcela e for digitado 2
}
}
return VendaTotalComJuros;
}
Isso acima foi um exemplo se fosse facil assim, rsrs
Pra começar, este método calcularValorComJuros está dentro de que?
TaxaObj é uma entidade, logo você terá várias instâncias dela, correto?
Você pode ter um Map de TaxaObj:
Map mapTaxas = new HashMap();
e neles, adicionar o carregamento do arquivo xml. Não sei como você fez este carregamento/leitura.
com isto ficaria mapTaxas.get(numeroDeParcelas) retornaria o valor do juros.
A sua dúvida é quanto a fazer o cálculo do juros (matemática) ou de como organizar estes dados (java) ?
Não está muito claro ainda.
Esse metodo calcularValorComJuros está dentro do Objeto LoginObj
Sim, TaxaObj é uma entidade, tenho varias instancias dela…
Eu consegui com o seguinte código
public String calcularParcela(int quantidadeParcela, Integer valorOriginal){
double valorComJuros = 0;
switch (quantidadeParcela) {
case 1:
valorComJuros = valorOriginal * (1 + (taxas.get(0).getJuros()/100));
break;
case 2:
valorComJuros = valorOriginal * (1 + (taxas.get(1).getJuros()/100));
break;
case 3:
valorComJuros = valorOriginal * (1 + (taxas.get(2).getJuros()/100));
break;
case 4:
valorComJuros = valorOriginal * (1 + (taxas.get(3).getJuros()/100));
break;
case 5:
valorComJuros = valorOriginal * (1 + (taxas.get(4).getJuros()/100));
break;
case 6:
valorComJuros = valorOriginal * (1 + (taxas.get(5).getJuros()/100));
break;
case 7:
valorComJuros = valorOriginal * (1 + (taxas.get(6).getJuros()/100));
break;
case 8:
valorComJuros = valorOriginal * (1 + (taxas.get(7).getJuros()/100));
break;
case 9:
valorComJuros = valorOriginal * (1 + (taxas.get(8).getJuros()/100));
break;
case 10:
valorComJuros = valorOriginal * (1 + (taxas.get(9).getJuros()/100));
break;
case 11:
valorComJuros = valorOriginal * (1 + (taxas.get(10).getJuros()/100));
break;
case 12:
valorComJuros = valorOriginal * (1 + (taxas.get(12).getJuros()/100));
break;
default:
valorOriginal;
break;
}
return String.valueOf(valorComJuros);
}
Sabemos que isso ficou terrível, hehe por eu não saber fazer umas coisas…
Sobre como eu leio o Xml e coloco na entidade TaxaObj segue o código abaixo:
public static void getSafeXmlElementTaxas(NodeList elem){
try {
Element line = null;
for (int i = 0; i < elem.getLength(); i++) {
TaxaObj taxaObj = new TaxaObj();
line = (Element) elem.item(i);
taxaObj.setParcela(line.getAttribute("parcelas"));
taxaObj.setJuros(line.getFirstChild().getNodeValue());
LoginSingleton.getInstance().getLoginObj().addTaxas(taxaObj);
}
} catch (Exception e) {
e.getLocalizedMessage();
}
}
Obrigado por tentar entender meu código, se puder me ajudar a dar uma melhorada no metodo calcularParcela()
public String calcularParcela(int quantidadeParcela, Integer valorOriginal){
double valorComJuros = 0;
if (quantidadeParcela >= 1 && quantidadeParcela <= 13){ // talvez seria até 12 meses, então esse 13 aqui seria 12 - mas para deixar exatamente equivalente a seu código deixei 13
valorComJuros = valorOriginal * (1 + (taxas.get(quantidadeParcela - 1).getJuros()/100));
}
return Double.toString(valorComJuros);
}
Obrigado, isso funciona se eu sempre receber um xml com 12 parcelas
<parcelada parcelas="1">3</parcelada>
<parcelada parcelas="2">5</parcelada>
<parcelada parcelas="3">8</parcelada>
<parcelada parcelas="4">9</parcelada>
<parcelada parcelas="5">10</parcelada>
<parcelada parcelas="6">11</parcelada>
<parcelada parcelas="7">13</parcelada>
<parcelada parcelas="8">15</parcelada>
<parcelada parcelas="9">16</parcelada>
<parcelada parcelas="10">17</parcelada>
<parcelada parcelas="11">20</parcelada>
<parcelada parcelas="12">22</parcelada>
Mas tem hora que vou receber assim
<parcelada parcelas="2">5</parcelada>
<parcelada parcelas="7">7</parcelada>
<parcelada parcelas="10">17</parcelada>
<parcelada parcelas="12">22</parcelada>
ou assim:
<parcelada parcelas="2">5.25</parcelada>
<parcelada parcelas="7">5.75</parcelada>
Então vou ter que fazer assim se o usuario dividir em 7 vezes é um juros, se ele dividir em 10 é um juros, se ele dividir em 12 e outro juros…
Então não vai dar pra pegar pelo indice do taxa.get(i).getJuros(), será que pode me ajudar?
Acho q a melhor maneira d resolver seu problema é utilizar ArrayList, vc add cada TaxaObj na lista com o número de parcelas e o valor dos juros, qdo receber o número de parcelas faz uma busca na lista e verifica o juro.
No seu problema acho q não vem ao caso mas poderia utilizar hashMap como disse o lsouza13 p/ melhorar a performance se fosse necessário.
Cara, usa um Map como o lsouza13 falou lah em cima, ao invés de um List.
Map<String/int, TaxaObj>
Se tiver dúvidas de como fazer isso fala ae.
Cara, muito obrigado pelas dicas, mas vou precisar de uma ajuda aqui… tentei fazer da seguinte maneira
Map<Object, Object> mapTaxas = new HashMap<Object,Object>();
for (int i = 0; i < taxas.size(); i++) {
mapTaxas.put(taxas.get(i).getParcela(), taxas.get(i).getJuros());
}
for (int i = 0; i < mapTaxas.size(); i++) {
if (quantidadeParcela>=Integer.parseInt(taxas.get(i).getParcela())) {
valorComJuros = String.valueOf((int)(valorOriginal*(1+(taxas.get(i).getJuros()/100))+(quantidadeParcela*getValorParcelas()*100)));
break;
}
}
Como o esse retorno do Xml nesse caso é assim
<parcelada parcelas="2">5</parcelada>
<parcelada parcelas="7">5.75</parcelada>
por exemplo, não sei como fazer para pegar o indice certo do juros para bater com a parcela… Alguém pode me ajudar?
Ai vão alguns conselhos:
Map<Object, Object> mapTaxas = new HashMap<Object,Object>(); // Aki eu usaria o Map com os tipos q eu iria utilizar. Ex Map<Integer, Double> mapParcelaJuros;
// Aki vc monta o Map a partir do List taxas. Não seria melhor substituir logo pra um Map? Tipo, ao invés de criar um List taxas, criaria logo o Map.
for (int i = 0; i < taxas.size(); i++) {
mapTaxas.put(taxas.get(i).getParcela(), taxas.get(i).getJuros());
}
// Não entendi bem esse IF, mas quando utilizado o Map esse FOR não seria necessário. Basta apenas pegar o valor do juros assim: mapTaxas.get(quantidadeParcela).getJuros()
for (int i = 0; i < mapTaxas.size(); i++) {
if (quantidadeParcela>=Integer.parseInt(taxas.get(i).getParcela())) {
//valorComJuros é uma String??
valorComJuros = String.valueOf((int)(valorOriginal*(1+(taxas.get(i).getJuros()/100))+(quantidadeParcela*getValorParcelas()*100)));
break;
}
}
Como eu faria?
Map<Integer, Double> mapTaxas = new HashMap<Integer, Double>();
for (int i = 0; i < taxas.size(); i++) {
mapTaxas.put(taxas.get(i).getParcela(), taxas.get(i).getJuros()); // Supondo que os tipos são Integer e Double.
}
valorComJuros = String.valueOf((int)(valorOriginal * (1+(mapTaxas.get(quantidadeParcela)/100))+(quantidadeParcela * getValorParcelas() * 100)));