Passagem de ArrayList

35 respostas Resolvido
O

Iae galera tudo bem… Sou novo em java e estou com um problema. Quando passo um ArrayList por parametro a outro metodo, o problema é que na hora da saida, pois não esta saindo o nome do Objeto mas algo mais ou menos parecido com isto…

Saida : programandocomputadores.TV@1cfb549

35 Respostas

B

Não entendi bem, vc poderia se explicar melhor?

thiagomartendal

Vou fazer um exemplo para ver se é o que você quer.

package teste;

import java.util.ArrayList;
import java.util.Iterator;

public class ArraysJava{
    public static void main(String[] args){
        ArrayList<String> SeuArray = new ArrayList<String>();
        Iterator Valores = SeuArray.iterator();
        while(Valores.hasNext()){
            String vals = Valores.next();
            System.out.println(vals);
        } 
    }
}
O

como posso explicar… Estou fazendo um Gerenciador de campeonato, durante o processo eu seleciono o número de jogadores

//ENTRAR COM NÚMERO DE JOGADORES

int N = Integer.parseInt(JOptionPane.showInputDialog(" Entre com número de jogadores:  "));

for(int i=0;i<N;i++){
String Nome = JOptionPane.showInputDialog(" Nome: ");
      
       
       Jogs.add(new Jogador(Nome)); // CRIOU O OBJETO E ADICIONO AO ARRAYLIST
}

       Gera_Grupo.Fase_Group(Jogs); //PASSO O ARRAYLIST PARA OUTRO METODO

Para este método que vou mostrar agora

static public void Fase_Group(ArrayList Jogs){

ArrayList<Jogador> Grupo = new ArrayList<Jogador> ();
    
            

    
     int i, j,b;
     cont = Jogs.size();
     Jogador Transp;
//COMEÇA PROCESSO PARA SELEÇÃO DE CHAVES

System.out.printf(GRUPO 1\n\n);

for(i=0;i<4;i++){
do{   
            Random gerador = new Random(); 
            int numero = gerador.nextInt(cont);
           // Seleção aleatória de números 
            b = numero;

           Transp = Jogs.get(b);//ADICIONANDO POSIÇÃO B À VARIÁVEL
            
            Jogs.remove(b);
            Jogs.add(b,null);// OCUPAR O LUGAR DO OBJETO EXCLUIDO
                           
      }
        while(Transp == null);
      
            Grupo.add(Transp);// GRUPO FORMADO

   System.out.printf(" %s \n", Transp);
   
     }

O Resultado do segundo método seria os nomes de todos os jogadores (objetos). Exemplo:

Grupo 1

Paulo
Rodrigo
Diego
Nunes

Porém o resultado está saindo assim:

GRUPO 1

Nt_console.Jogador@1376c05c
Nt_console.Jogador@51521cc1
Nt_console.Jogador@1b4fb997
Nt_console.Jogador@deb6432

B
Solucao aceita

Bom, vamos la.

primeiramente umas dicas. Quando for posta codigo coloque o mesmo entre as tags [code"][/code"] (sem as aspas fica melhor melhor para entendermos). Outra dica faça uma pesquisa sobre boas praticas de programação java, é uma serie de convenções por exemplo, devemos nomear variaveis iniciando com letra minuscula caso sejam mais de uma palavra, iniciamos com minuscula e a primeira letra da segunda em maiuscula seguido de minusculas exemplo:

String nome;
Date dataDeNascimento;

Agora vamos ao seu problema. Pelo q eu entendi "Transp" e um objeto do tipo "Jogador" e para imprimir o nome do mesmo ñ podemos simplesmente manda exibir "Transp" pois ele um objeto para imprimir o atributo "nome" você deve criar os metodos de acesso getters e setters, ai vc poderia fazer uma chamada ao metodo get do atributo nome (Transp.getNome()) para exibir o nome.
mas caso vc ñ tenha definido o atributo como "private"(faça uma pesquisa também sobre modificadores de acesso para entender melhor caso vc ñ saiba oq a palara reservada private faça), so precisaria fazer "Transp.nome" exemplo

System.out.println("%s \n", Transp.getNome()); //caso tenha definido a variavel como private

ou

System.out.println("%s \n", Transp.nome);
O

O galera muuuito obrigado pelas dicas

B

Funcionou? se sim edite o topico e no inicio do nome coloque [RESOLVIDO]. Qualquer duvida e só falar.

O

Cara funcionou cara … Obrigado mesmo rodou direitinho…

smatt

Galera, no caso de eu usar um iterator para percorrer uma arraylist, porem usando a arquitetura MVC (no caso seria no controller), o código “padrão” de iterator mudaria?

No caso, o código “padrão” seria assim:

for (Iterator iterator = a.iterator(); iterator.hasNext();) {
            suaClasse obj = (suaClasse) iterator.next();

Ou:

while (iterator.hasNext()) {
            suaClasse obj = iterator.next();

Mas no caso, usando no controller, o código seria este mesmo ou sofreria alguma mudança?

staroski

MVC não tem nada a ver com a forma que você itera suas coleções.

Particularmente ao invés de fazer assim:

for (Iterator iterator = colecaoDeObjetos.iterator(); iterator.hasNext(); ) {
    TipoDeDado objeto = (TipoDeDado) iterator.next();

Faço assim, pois é bem mais legível:

for (TipoDeDado objeto : colecaoDeObjetos) {
smatt

No caso, quando criei a arraylist pus como tipo de dado a classe Model, onde ficará guardado os valores que o usuario digitou na View:

ArrayList <InserirModel> Insere = new ArrayList <>();

Porém, quando vou criar um metodo no Controller, ele não aceita eu criar o iterator dessa forma que vc me disse, e que eu marquei logo acima:

public class ViewController {
    
    InserirModel im = new InserirModel();

    public void mostraDados(ArrayList a) {
    for (InserirModel obj : a) {
            
        // Digitando isso, o NetBeans ja me da um alerta dizendo pra mudar a variável "obj" para o tipo Object, mas dessa forma, perco a referência ao Model. 
        
        }

Como suceder nesse caso?

Quando crio o for each na View, ele aceita, mas no Controller, ele da esse alerta

staroski

As implementações da interface List são genéricas desde o Java 5, então procure especificar o tipo de dado ao declará-las.
Se não especificar o tipo, o compilador entende como sendo Object.

Troque a seguinte assinatura de método:

public void mostraDados(ArrayList a) {

Para ser assim:

public void mostraDados(List<InserirModel> a) {
smatt

Aparece uma mensagem dizendo que list não aceita parâmetros. Mas pondo “arraylist” o erro é corrigido. Dessa forma aqui deu certo:

public void mostraDados(ArrayList<InserirModel> a) {

Mas, obrigado @staroski pela ajuda!

FearX

você pode ter importado a lista errada. List é uma interface que é implementada por ArrayList.

smatt

So tem uma lista no meu programa. E mudando para “arraylist” deu certo.

FearX

O correto ainda seria utilizar a List. Novamente: Você deve ter importado errado.

smatt

Mas ai no caso vc está dizendo la no import? Aquela parte la de “import java” ?

FearX

Sim. Muitas vezes eu importei a List do pacote errado e não consegui utilizar. Dizer “List não aceita parâmetros” é quase um indicativo que você importou errado, rs.

Usar List ao invés de uma ArrayList é apenas uma boa prática, não uma obrigação. Com uma List, independente de você receber uma List, uma ArrayList ou uma LinkedList você não vai ter problemas.

staroski

Você deve ter importado java.awt.List ao invés de java.util.List.
É só corrigir seu import.

smatt

Ahh certo kk vou dar uma olhada.

Ótimo conselho! Sou novo no java então é sempre bom ouvir a voz da experiência kkk

Ja conferi aqui e era isso mesmo! Obrigado pela paciência @staroski e @FearX

staroski

Se a classe que você usa, possui uma interface, então procure declarar as variáveis como sendo do tipo da interface.

smatt

Meu projeto tem 3 classes, como está em padrão MVC: View, ViewController e InserirModel. Na interface tenho as variaveis correspondentes a número da conta, titular, saldo inicial e limite. (São campos que o usuario preenche) Poderia exemplificar para eu entender melhor essa sua afirmação?

staroski

No pacote java.util existem algumas classes e interfaces.
A classe ArrayList implementa a interface List.

Então no seu código, ao invés de declarar as variáveis como sendo do tipo ArrayList (classe), declare como List (interface).

smatt

Exemplifique por favor essa declaração das variáveis. (Estou meio boiando ainda ‘-’ kkk)

staroski

Ao invés de declarar assim:

ArrayList<TipoDeDado> minhaLista;

Declare assim:

List<TipoDeDado> minhaLista;
smatt

No caso eu fiz assim:

List Insere = new ArrayList<>();

Ou deveria ser assim:

List Insere = new List<>();

Lucas_Camara

Você precisa sobrescrever o método toString da classe. Por padrão, esse método imprime o nome da completo da classe junto com o hashcode do objeto criado.

Faça algo mais ou menos assim:

public class Pessoa {

    private Long id;
    private String nome;

    // getters and setters

    @Override
    public String toString() {
        return nome;
    }
}
staroski

Perfeito!

Postou sem testar né? Isso dá erro de compilação.
Uma interface é um tipo abstrato de dado, não dá pra instanciar.
Você sempre instancia alguma classe que implementa a interface.

smatt

Perfeita explicação! Um dia serei igual a vocês aqui do fórum kk obrigado a todos!

staroski

O que isso tem a ver com a discussão desse tópico?

FearX

Essa ansiedade é complicada. Quando eu entrei no fórum, não tinha muito conhecimento, também. Mas por experiência, lhe digo que a única forma de aprender é estudando e fazendo. Tem N formas de se estudar - eu especialmente gosto de tutoriais em vídeos, livros e fóruns. Mas não consigo utilizar 100% das documentações ainda, com certeza por falta de experiência.

Vale a pena estudar, o que quer que seja. Antes de entrar de cabeça no mundo do desenvolvimento, eu estudava MUITA filosofia. Muita mesmo. Nietzsche e Voltaire especialmente. Não vou dizer que foi inútil - agregou muito para minha visão sobre o mundo. Mas eu poderia ter gastado esse tempo estudando Java, por exemplo.

Enfim, o que eu quero dizer é que vai chegar um dia onde você vai estar respondendo as perguntas no fórum e pra você vai ser simples. Mas para isso você não pode/deve parar de estudar.

[]'s

Lucas_Camara

Por conta disso

smatt

Sábias palavras, e obrigado pelo incentivo! :slight_smile:

smatt

Porém vc respondeu coisa de 4 anos atras kkkkk a pessoa provavelmente achou a solução em outro lugar kk eu que ressucitei o forum com outra duvida kk

Lucas_Camara

Pois é, dai reparei isso soh agora msm. #fail

smatt

:rofl::rofl:

Criado 29 de maio de 2015
Ultima resposta 23 de abr. de 2019
Respostas 35
Participantes 7