[RESOLVIDO]Logica de apresentação de objetos em uma laço for

Bom dia!

Pessoal, tenho uma duvida que relativamente é simples, mas não consigo pensar em uma forma eficaz de contornar a exibição de uma especie de “breadCrumb” que estou criando para exibir as categorias de um sistema que estou desenvolvendo.

Abaixo segue o método em questão:

public String getCategoryNameBreadCrumb(Document doc) { Collection<Object> cat = doc.getFieldValues("level_main_name"); String dados = ""; if(cat != null && cat.toArray() != null){ for (Object object : cat) { dados += "|" + object.toString(); } return dados; } return ""; }

O que acontece é que os valores que estão chegando estão ficando na ordem inversa do que na verdade precisa ser exibido:

|Pasta Suspensa|Pastas|Escritório

O correto seria ficar desta maneira:

Escritório|Pastas|Pasta Suspensa

Não estou conseguindo imaginar com posso resolver esse problema, creio que um laço for com iteração funcione, mas não consegui resolver.

Se alguém tiver alguma ideia ou comentário que posso me ajudar ficarei grato desde já!

Um abraço todos!

faz um for com indice e comece do maior para o menor. :wink:

Obrigado pela dica mauricioadl!

Será que pode me ajudar a montar a logica?

Seria mais ou menos assim?

[code] if(cat != null && cat.toArray() != null){
for (int i = -3; i < cat.size(); i–) {

		}[/code]

Obrigado pela atenção e o tempo!

[quote=manolo]Obrigado pela dica mauricioadl!

Será que pode me ajudar a montar a logica?

Seria mais ou menos assim?

[code] if(cat != null && cat.toArray() != null){
for (int i = -3; i < cat.size(); i–) {

		}[/code]

Obrigado pela atenção e o tempo![/quote]
Camarada, de onde tu veio?
O método doc.getFieldValues(“level_main_name”) retorna o que?
Você pode alterá-lo para retornar uma LinkedList e garantir a ordenação dos registros.
Pode usar um ListIterator e iterar no sentido inverso (hasPrevious e previous).
Pode criar um for cujo índice seja inicializado com o size da Collection e vá decrementando.

public String getCategoryNameBreadCrumb(Document doc) { Collection&lt;Object&gt; cat = doc.getFieldValues("level_main_name"); StringBuffer dados = new StringBuffer(); if(cat != null && cat.toArray() != null){ Object[] array = cat.toArray(); for (int i = array.length - 1; i == 0; i--) { dados.append("|" + array[i]); } } return dados.toString(); }

seria algo assim

[]'s

Obrigado a todos pela atenção! Tentarei implementar as soluções propostas.

seu problema realmente é básico, mas não é sobre seu código e sim sobre operadores.

No java o único operador sobrecarregado é o + (usado pra somar números E concatenar Strings).

quando vc faz

dados += "|" + object.toString();

seria o mesmo que

dados = dados + "|" + object.toString();

com isso vc está concatenando os nomes ao final da String, quando na verdade seu objetivo é concatenar no início.

Então temos o novissimo e sem teorias miraculosas de iteração inversa.

dados = object.toString() + "|" + dados;

Só uma observação sobre StringBuffer, esse cara é sincronizado (lento) e esse StringBuilder faz a mesma coisa, só que não é e com isso mais rápido.

as Strings em Java são imutáveis, então pra cada atribuição/concatenação vc vai criar um objeto no heap, agora com StringBuilder vc só cria um e vai alterando.

Legal carlosmoreira! Obrigado pela dica.

Acabei resolvendo de uma outra forma:

int count = 0; for (int i = array.length - 1; i <= 2 && i >= 0; i--) { if (count == 0) { dados.append(array[i]); }else{ dados.append("|" + array[i]); } count++; }

Adicionei apenas um contador para verificar se é a primeira vez que o laço é executado. Serviu 100%.

Agradeço a todos pelo tempo e ajuda.

Abraço!