Como percorrer um Array que está em outro array

Boa noite amigos,

gostaria de saber como posso percorrer um Array de objetos dentro de outro array?

Por exemplo:

Tenho um array de uma classe chamada Grupo[], que possui atributos como:

Grupo.java:

grupoId : int
nomeGrupo : String
membros : Usuario[]

Note que o atributo membros eh do tipo Usuario e tambem eh um array, que possui os atributos:

Usuario.java:

usuarioId : int
nomeUsuario : String
sexo : boolean

Se eu quiser juntar todos os usuariosId de todos os grupos em um int[], como posso proceder?

Abraço!

se tu só quer contar qtos tem cada grupo, é só fazer um for p imrpimri o length de cada array de membros

for (int i=0;i<grupos.length();i++){
  System.out.println("Grupo " + i +" possui " + membros.length() + " membros");

}

[]s

[quote=berg.pb]se tu só quer contar qtos tem cada grupo, é só fazer um for p imrpimri o length de cada array de membros

for (int i=0;i<grupos.length();i++){
  System.out.println("Grupo " + i +" possui " + membros.length() + " membros");

}

[]s[/quote]

Berg, obrigado pela resposta… na verdade não é só isso que eu preciso… talves tenha me expressado mal…
Vou colocar um código fictício (que não compila), mas é onde posso por o problema:


int[] usrs = null;

//Percorrer o array do grupos
for(int i = 0; i < grupos.length; i++){
   // Do grupo pegar a lista de usuários
    Usuario[] usr = grupos[i].getUsuario();
    
   //Percorrer a lista de usuarios
    for(int j = 0; j< usr.length; j++){
         //Pegar cada usuário
          Usuario usr2 = usr[j];
           // Aqui vc estará com o valor do array e vc faz o que quiser.
    }

    // Não compila... eh soh exemplo...
    usrs += new int[usrs.length + usr2.length];
    usrs += usr2;

}

// Aqui todos os Usuarios de todos os grupos
System.out.println("Qde.: " + usrs.length);
System.out.println("Nome do #3: " + usrs[3].getNome);

Obviamente esta última parte não compila… mas é onde estou em um impasse…

Abs.

Se você vai acessar somente o array de Usuario, faça um for dentro de outro, como por exemplo:

// manja de for-each (enhanced-for)
for (Grupo gruop : grupos) { // percorre o vetor de grupos
    for (Usuario user : group.membros) { // percorre o vetor de membros para cada grupo no vetor principal
        System.out.printl(user.getNome());
    }
}

Ou:

for (int i = 0; i < grupos.length; i++) {
    for (int j = 0; j < grupos[i].length; j++) {
        System.out.println(grupos[i].membros[j].getNome());
    }
}

List<Usuario> listaDeUsuarios=new LinkedList<Usuario>(); for(Grupo grupo: seuArrayGrupo){ listaDeUsuarios.addAll(Arrays.asList(grupo.getUsuarios); } //aqui vc usa a lista para recuperar os dados que kiser....

Interessante. Agradeço o apoio recebido!

O enhanced for é interessante, mas creio que fique na mesma situação, pois o que vou fazer com estes dados é inserir em uma JTable através de um DefaultTableModel(Object[] data, String[] columns), onde irei passar os dados de cada usuário em data.

Mas gostei da solução usando List… na verdade nunca trabalhei com Lists… mas pelo que vi parece ser o ideal e vai atender.

Quando eu terminar o projeto, irei postar ele OpenSource no dev.java! É um software de agendamento, onde suporta multiusuários, grupos , permissões por grupos e usuários, criação de eventos… implementando MVC.

Grato Renzo,

List<Usuario> listaDeUsuarios=new LinkedList<Usuario>(); for(Grupo grupo: seuArrayGrupo){ listaDeUsuarios.addAll(Arrays.asList(grupo.getUsuarios); } Object[] arrayDeDados=listaDeUsuarios.toArray(); //use aqui os dados para popular deu DefaultTableModel

Como eu uso o SwingBean para popular e obter dados de minhas tabelas, eu nunca preciso transformar em array, sempre uso List mesmo.

Renzo,

meu código ficou assim, utilizando HashSet mas com um problema:


// Meu set de Permissoes de usuarios
HashSet<UserPermitionUser> setPermitionUsers = new HashSet<UserPermitionUser>();

                // aqui percorre o array de permissoes de grupos
                for (int i = 0; i < userInstancePermitions.length; i++) {

                    // por ciclo, cada grupo possui um array de Permissoes de usuarios, que aqui eh percorrido
                    for (int j = 0; j < userInstancePermitions[i].permitionUsers.length; j++) {

                        // AQUI O PROBLEMA: eu adiciono cada permissao de usuario
                        setPermitionUsers.add(userInstancePermitions[i].permitionUsers[j]);

                    }
                }
                
                // Aqui vao os Users IDs para fazer query no BD
                uids = new int[setPermitionUsers.size()];

                // Para percorrer as permissoes do usuarios
                Iterator iterator = setPermitionUsers.iterator();

                int i = 0;
                while (iterator.hasNext()) {

                    // Aqui tras cada Permissao de usuario do iterator do set
                    UserPermitionUser eachUser = (UserPermitionUser) iterator.next();

                    // Cada Permissao de Usuario possui um getUidTarget, onde retorna o User ID alvo da permissao de cada usuario
                    uids[i] = eachUser.getUidTarget();
                    i++;

                }

// Loop para exibir pelo SysOut
for (int i = 0; i < uids.length; i++) {

                // Aqui deve exibir os usuarios que possuo permissao
                System.out.println("User ID: " + uids[i]);

}

Um problema nesse código existe:

HashSet PROMETE que cada vez que você adiciona um Objeto, ele checa a existência de um igual antes de atribuí-lo, para não haver duplicidade… (pelo menos foi o que eu entendi).

Mas no meu caso, vêm um monte de Permissão de Usuário iguais!!

Se fosse fazer um SysOut, ele sai assim:

1
2
2
2
2
2
3
3
4
5
5
5
5

Mas deveria sair:

1
2
3
4
5

O que você acha???

Abs.,

Sim, ele faz isso, desde que a classe do objeto implemente corretamente a interface Comparable ou que você passe um Comparator para ele realizar o trabalho.