Fazer quebra utilizando lista

ai galera tenho o seguinte codigo

public class Grupos(){
   private int codigo;
   private int subcod;
   private String descricao;
   private float total;
   public Grupos(int codigo,int subcod,String descricao,float total){
      this.codigo = codigo;
      this.subcod = subcod;
      this.descricao = descricao;
      this.total = total;
   }
 // demais gets e sets
}

public class MontaGrupos(){

    public MontaGrupos(){
        List<Grupos> grupos = new ArrayList<Grupos>();
        grupos.add(new Grupos(1,1,"Grupo 1",10));
        grupos.add(new Grupos(1,2,"Grupo 1",15));
        grupos.add(new Grupos(2,1,"Grupo 2",5));
        grupos.add(new Grupos(2,3,"Grupo 2,"10));
    }

}

Minha duvida é como fazer pra imiprir isto no console mesmo (System.out.println) que ficasse dessa forma
Grupo …: Grupo 1
10
15
Total Grupo 25
Grupo …: Grupo 2
5
10
Total Grupo 15

Alguem pode me ajudar a fazer esta “quebra” por grupo??

Puxa vida, não é nada que um pouco de “ifs” e umas variaveizinhas temporárias não resolvam, não? Vou pôr em pseudo-código, e veja se é isso mesmo.

variável descricao = "";
variável somatoria = 0;
variável primeiraVez = true;
repetir para cada grupo da lista:
    se grupo.descricao diferente de descricao 
    então
       se não for primeiraVez, imprimir total do grupo anterior;
       imprimir cabeçalho com a descrição do novo grupo;
       descricao = grupo.descricao;
       somatoria = 0;
       primeiraVez = false;
    senão
       imprimir o grupo;
       somatória += grupo.total;
    fim se;
enquanto não encontrar o final da lista;

Uma dica importante. É bom que o nome de uma classe esteja no singular (Grupo) e o nome de uma coleção dessa classe esteja no plural (grupos); isso ajuda na leitura de seu programa.

Você pode implementar um Comparable na sua classe Grupos que classifique por grupo. Ai depois você manda ordenar seu ArrayList. Ai depois é só fazer a iteração e ir imprimindo os elementos…

T+

[quote=thingol]Puxa vida, não é nada que um pouco de “ifs” e umas variaveizinhas temporárias não resolvam, não? Vou pôr em pseudo-código, e veja se é isso mesmo.

variável descricao = "";
variável somatoria = 0;
variável primeiraVez = true;
repetir para cada grupo da lista:
    se grupo.descricao diferente de descricao 
    então
       se não for primeiraVez, imprimir total do grupo anterior;
       imprimir cabeçalho com a descrição do novo grupo;
       descricao = grupo.descricao;
       somatoria = 0;
       primeiraVez = false;
    senão
       imprimir o grupo;
       somatória += grupo.total;
    fim se;
enquanto não encontrar o final da lista;

Uma dica importante. É bom que o nome de uma classe esteja no singular (Grupo) e o nome de uma coleção dessa classe esteja no plural (grupos); isso ajuda na leitura de seu programa. [/quote]

se usar um for each nao ajuda nao?

Pode usar até goto e invokespecial (bytecodes da JVM) que não me importo; o algoritmo é que importa.

Realmente esqueci de afirmar que antes de fazer o “repetir para…” a lista deve estar ordenada por grupos.

[quote=thingol]Pode usar até goto e invokespecial (bytecodes da JVM) que não me importo; o algoritmo é que importa.

Realmente esqueci de afirmar que antes de fazer o “repetir para…” a lista deve estar ordenada por grupos.
[/quote]

Thingol, o que é invokespecial???

Grato,

Diego.

[quote=LPJava]
se usar um for each nao ajuda nao?[/quote]

E como vc faria a colocação do ForEach em Pseudo diferente da colocada pelo thingol e que fizesse um impacto maior?!?

Hum, é que só estava comentando que pseudo-código é uma forma de descrever um algoritmo e que você poderia usá-lo para implementar em qualquer linguagem. Para não ficar muito longe do mundo Java, a pessoa poderia programar diretamente nos bytecodes gerados pelo compilador; entre os quais se listam:

  • invokestatic - serve para chamar métodos estáticos;

  • invokevirtual - serve para chamar métodos de instância;

  • invokespecial - serve para chamar alguns métodos especialmente, como os construtores e o “super”.

Vou dar um exemplo de por que isso é necessário. Digamos que você tenha as seguintes classes:

class Pessoa { public String getNome() { return "Maria"; } }
class Criança extends Pessoa { public String getNome() { return super() + "zinha"; }

Quando você chamar o método getNome da classe Criança, ele tem de chamar o método getNome da classe Pessoa (através da palavra-chave especial “super”. ) Isso é compilado em Java mais ou menos como:

invokespecial Pessoa.getNome; // é o que o "super" faz

Ele não pode simplesmente chamar o método getNome() sem especificar de que classe é, porque senão teríamos uma recursão infinita (já que em vez de chamar o getNome de Pessoa iria chamar o getNome de Criança.)

[/code]

Muito obrigado.

Você como sempre ajudando a todos.

Diego.