Acessar um ArrayList e comparar valores

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

&lt;parcelada parcelas="1"&gt;3&lt;/parcelada&gt;
&lt;parcelada parcelas="2"&gt;5&lt;/parcelada&gt;
&lt;parcelada parcelas="3"&gt;8&lt;/parcelada&gt;
&lt;parcelada parcelas="4"&gt;9&lt;/parcelada&gt;
&lt;parcelada parcelas="5"&gt;10&lt;/parcelada&gt;
&lt;parcelada parcelas="6"&gt;11&lt;/parcelada&gt;
&lt;parcelada parcelas="7"&gt;13&lt;/parcelada&gt;
&lt;parcelada parcelas="8"&gt;15&lt;/parcelada&gt;
&lt;parcelada parcelas="9"&gt;16&lt;/parcelada&gt;
&lt;parcelada parcelas="10"&gt;17&lt;/parcelada&gt;
&lt;parcelada parcelas="11"&gt;20&lt;/parcelada&gt;
&lt;parcelada parcelas="12"&gt;22&lt;/parcelada&gt;

Mas tem hora que vou receber assim

&lt;parcelada parcelas="2"&gt;5&lt;/parcelada&gt; &lt;parcelada parcelas="7"&gt;7&lt;/parcelada&gt; &lt;parcelada parcelas="10"&gt;17&lt;/parcelada&gt; &lt;parcelada parcelas="12"&gt;22&lt;/parcelada&gt;

ou assim:

&lt;parcelada parcelas="2"&gt;5.25&lt;/parcelada&gt;
&lt;parcelada parcelas="7"&gt;5.75&lt;/parcelada&gt;

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&lt;Object, Object&gt; mapTaxas = new HashMap&lt;Object,Object&gt;();
		for (int i = 0; i &lt; taxas.size(); i++) {
			mapTaxas.put(taxas.get(i).getParcela(), taxas.get(i).getJuros());
		}
		
		for (int i = 0; i &lt; mapTaxas.size(); i++) {
			
			if (quantidadeParcela&gt;=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

&lt;parcelada parcelas="2"&gt;5&lt;/parcelada&gt;
&lt;parcelada parcelas="7"&gt;5.75&lt;/parcelada&gt;

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