Percorrer várias Strings com o mesmo nome

E aí pessoal! Beleza?
Tenho essa string:

DebitosPendentes{" +
"Vencimento=2018-04-10; " +
"ValorAtualizado=29.92; " +
"Valor=29.92; Sequencia=9999; " +
"NroBanco=9999; " +
"BcoCobr=Banco; " +
"Cobranca=Boleto; " +
“Itens=[” +
“ListaItens{” +
"Descricao=Contrato; " +
"ValorItem=9.97; }, " +
“ListaItens{” +
"Descricao=Contrato; " +
“ValorItem=19.95; }]; },” +
“DebitosPendentes{” +
"Vencimento=2018-03-10; " +
"ValorAtualizado=29.92; " +
"Valor=29.92; " +
"Sequencia=9999; " +
"NroBanco=9999; " +
"BcoCobr=Banco; " +
"Cobranca=Boleto; " +
“Itens=[” +
“ListaItens{” +
"Descricao=Contrato; " +
"ValorItem=9.97; }, " +
“ListaItens{” +
"Descricao=Contrato;
ValorItem=19.95; }]; }, "

Como faço para percorrer cada item dessa string?
Obs: Eu tentei com indexOf, mas dá erro, por causa que tem mais itens com o mesmo nome na string.

Me parece um JSON (eu sei que não é, ainda mais pelos diversos “=” dentro do código).
Mas, a estrutura é de JSON. Logo, eu faria um replaceAll("=", “:”) e outro replaceAll(";", “,”) e converteria em elementos JSON para ler com mais facilidade.
Ou quebraria em array de String com split(";") e daí leria item a item.

1 curtida

O indexOf é sobrecarregado, podendo passar o índice inicial da consulta.

Mas no seu caso, já que os campos são separados por ponto e vírgula, você pode fazer um split(";") da String.

2 curtidas

Fiz a pergunta errada pessoal, eu já fiz o split. Aí fui tentar fazer o indexOf pra pegar o valor do item deu erro.
Fiz dessa forma:

for(int i = 0; i < debitos.length; i++){
int contador = debitos[i].toString().indexOf(“ValorItem=”);
int inicio = debitos[i].toString().indexOf(“Descricao=”)+10;
descricao1[i] = debitos[i].toString().substring(inicio, contador-2);
}

Mas ta dando erro, acredito que seja porque tem mais que um “ValorItem” e “Descrição”. Então, queria saber se tem como ir para o próximo indexOf, por exemplo
Obs: Nesse caso a variável “debitos” é um vetor objetos e a “descrição1” é um vetor de strings

Como converter pra JSON?

Existem bibliotecas para isso, como a Gson do google.
Neste caso, você precisaria de um POJO contendo os atributos que o teu JSON teria, pois faria a deserialização da String para objeto java (ou lista de objetos, enfim).

Não deu certo dessa forma Luis…
Gente só quero pegar o valor do item “ValorItem” :confused:
Tipo:
primeiro valor do item “ValorItem” = 9.97 (Guardo na primeira posição do vetor)
segundo valor do item “ValorItem” = 9.97 (Guardo na segunda posição do vetor)
E assim por diante…

Cara, lembra das aulas de MMC e MDC? Então, se uma sugestão não rolou, tenta encontrar a forma mais adequada de quebrar no menor pedaço possível para que você possa ler essas informações sem maiores problemas.

Cola a mensagem de erro pra gente aqui.

Não necessariamente da erro… O problema é que só pega o primeiro “ValorItem”, sendo que eu queria que pegasse todos “ValorItem” que tem no vetor de string :confused:

Seria um erro de lógica por minha parte…

vou te ajudar. peraê…

Beleza :slight_smile:

Este código não vai te servir completamente, mas da pra você ter uma ideia da minha lógica, e aplicar ao seu código, ao que você quer fazer exatamente com este valor.

for(int i = 0; i < debitos.length; i++){
		Integer aux = debitos[i].toString().indexOf("ValorItem=");
		while (aux != -1) {
			int contador = debitos[i].toString().indexOf("ValorItem=");
			int inicio = debitos[i].toString().indexOf("Descricao=")+10;
			descricao1[i] = debitos[i].toString().substring(inicio, contador-2);
		
            	debitos[i].toString().replaceFirst("ValorItem=", "");
			aux = debitos[i].toString().indexOf("ValorItem=");
		}
}

Em resumo: você faz um while, ate que o index seja -1 (que simboliza que n existe mais a ocorrencia daquela string.)

pega somente o primeiro item como de costume;
remove o primeiro item;
pega novamente o primeiro item (que agora será o segundo de antes… e assim por diante.

1 curtida

Eu fiz aqui, mas continua pegando o primeiro item.
Olha o código:

for(int i = 0; i < debitos.length; i++){
    int aux = debitos[i].toString().indexOf("ValorItem=");// auxiliar recebe ValorItem na posição 23
    int aux2 = 0;
    while (aux != aux2) { // Enquanto auxiliar for diferente que aux2, faça
            int contador = debitos[i].toString().indexOf("ValorItem="); // contador recebe 23
            int inicio = debitos[i].toString().indexOf("Descricao=")+10; // inicio recebe 3
            descricao1[i] = debitos[i].toString().substring(inicio, contador-2); // descrição receberá a string
            // que estiver entre essas duas posições, que no caso é "Contrato de internet"
            aux2 = aux; // aux2 receberá 23
            debitos[i].toString().replace("ValorItem=", ""); // substitui o ValorItem na posição 23 por nada
            aux = debitos[i].toString().indexOf("ValorItem=");// auxiliar recebe o ValorItem na próxima posição, como por exemplo 50
            Log.i("descricao", "Descrição Débitos: " + descricao1[i]);
     }
 }

Eu tava lendo sobre o indexOf, parece que tem como começar de uma posição ou algo assim. Vi que tem uma propriedade dele assim “indexOf(int ch, int fromIndex)”. Você tem conhecimento sobre isso? Ou alguém poderia me explicar melhor? Porque não entendi muito bem

Eu tava pensando aqui… Se for seguindo essa lógica, eu também tenho que trocar a “Descrição”. Dessa forma, não corro perigo de ler mais informação do que preciso.

mas você não seguiu a lógica que sugeri…

algumas dicas:

1 - você precisa usar o replaceFirst para substituir somente a primeira aparição e não o resto todo;
2 - precisa usar o indice -1 como condição de parada, porque caso não exista mais ocorrência daquela string ele sai do seu while;
3 - esse somatório com 10 ai ta ficando estranho, você pode usar o indexOf("=") e pegar a posição logo após o sinal de =;

uma dúvida, se você quebrou sua string em um array de strings, e cada posição i contem uma string no formato “item=valor” e ta dando um for em i, não faz sentido ele pegar somente o primeiro item, seu problema é a lógica de implementação. posta mais do código ai pra tentar te ajudar…

Desculpa, achei que tinha seguido.

Eu troquei o “replace” para “replaceFirst”, e continua pegando o primeiro…

Se eu troco para -1 dá loop infinito.

Mas aí vai ter mais “=” na string e vou cair no mesmo caso

como está sua String?

pelo que entendi você fez um split dos ; dentro de um vetor chamado debitos, correto?

se você fez isso, não tem mais de um = por string não.

seu vetor ta assim

debitos[0] ="Vencimento=2018-04-10"
debitos[1] ="ValorAtualizado=29.92;"
debitos[2] ="Valor=29.92;"
debitos[3] =“Sequencia=9999;”

etc…

então quando você pega o valor de débitos i, você está pegando somente aquele valor equivalente ao indice i;
então se vc tiver mais de um ValorItem, ele vai pegar todos, porem cada um estará em sua devida posição no vetor descricao1[i];

uma pergunta, o que você deseja fazer com este código? pelo que vejo é possivel refatorá-lo para tornar mais eficiente. se me explicar o que quer, te ajudo.

Na verdade eu criei um vetor de objetos, onde por exemplo tem 9 posições e em cada posição contém dentro essas informações (Vencimento, valor atualizado, valor…). No caso estou fazendo um “for” para armazenar a informação de cada um deles. Segue o código abaixo.

for(int i = 0; i < debitos.length; i++){
    int contador = debitos[i].toString().indexOf("ValorAtualizado=");
    int inicio = debitos[i].toString().indexOf("Vencimento=")+11;
    vencimento1[i] = debitos[i].toString().substring(inicio, contador-2).replaceAll("-", "/");
}

for(int i = 0; i < debitos.length; i++){
    int contador = debitos[i].toString().indexOf("Valor=");
    int inicio = debitos[i].toString().indexOf("ValorAtualizado=")+16;
    valorAtualizado1[i] = debitos[i].toString().substring(inicio, contador-2).replaceAll(",","");
    nf = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
    valorAtualizado2[i] = nf.format(Double.valueOf(valorAtualizado1[i]));
}

Está dessa forma:

Debitos[0] = [DebitosPendentes{Vencimento=2018-04-10; ValorAtualizado=29.92; Valor=29.92; Sequencia=9999; NroBanco=9999; BcoCobr=Banco; Cobranca=Boleto; Itens=[ListaItens{Descricao=Contrato; ValorItem=9.97; }, ListaItens{Descricao=Contrato; ValorItem=19.95; }];

Debitos[1] = [DebitosPendentes{Vencimento=2018-03-10; ValorAtualizado=29.92; Valor=29.92; Sequencia=9999; NroBanco=9999; BcoCobr=Banco; Cobranca=Boleto; Itens=[ListaItens{Descricao=Contrato; ValorItem=9.97; }, ListaItens{Descricao=Contrato; ValorItem=19.95; }];

1 curtida