Detectar tipo de variavel de cada posição do ArrayList

5 respostas
M
int i=4;
double d=12.27;
String s="Texto";

ArrayList a=new ArrayList();
a.add(i);
a.add(d);
a.add(s);

for(int i=0;i<a.size();i++){
    if(a.get(i) FOR_UM_DOUBLE){
        System.out.println("Eh um double...");
    }else{
        //PRA CADA TIPO DE VARIAVEL MOSTRARIA A MENSAGEM DIZENDO O TIPO DESTA VARIAVEL
    }
}

Como posso fazer isso?

5 Respostas

D
if ( a.get(i) instanceof Double ) ...

Sò tome cuidado. Você não deve colocar tudo e qualquer coisa dentro da mesma lista.
O ideal é colocar classes da mesma hierarquia para poder usar polimorfismo caso necessário.
Outro ponto importante é usar genéricos para especializar sua lista.

[]'s

V
Para obter o nome da classe de um objeto:
obj.getClass().getName();

Tome cuidado pois seu programa também realiza algumas conversões de tipo implícitas (AutoBoxing). No fundo ele faz isso aqui:

int i= 4;  
    double d= 12.27;   
    String s = "Texto";  
      
    ArrayList a=new ArrayList();  
    a.add(Integer.valueOf(i));  
    a.add(Double.valueOf(d));  
    a.add(s);  
      
    for(int i=0;i&lt;a.size();i++){  
        if(a.get(i) instanceof Double){  
            System.out.println("Eh um Double...");  
        }else{  
            System.out.println(a.get(i).getClass().getName());
        }  
    }
Para comprovar o que estou falando, teste:
Double x1 = 12.5;
double x2 = 12.5;
if (x1.getClass() == x2.getClass())
   System.out.println("Double e double pertencem a mesma classe.");
else
   System.out.println("Double e double não pertencem a mesma classe.");

List lista = new ArrayList();
lista.add(x2);

if (x1.getClass() == lista.get(0).getClass())
   System.out.println("Na lista, um objeto Double foi automaticamente criado para x2.");
else
   System.out.println("Na lista podem existir variáveis do tipo double");
> Mas também reforço o que o David falou. Geralmente, um ArrayList contém variáveis apenas de um tipo, ou filhos de um tipo. É importante saber o que esperar do get, sem ficar testando coisas. E o ideal é declara-lo já indicando esse tipo:
List<String> lista = new ArrayList<String>();
L

davidbuzatto:
if ( a.get(i) instanceof Double ) ...

Sò tome cuidado. Você não deve colocar tudo e qualquer coisa dentro da mesma lista.
O ideal é colocar classes da mesma hierarquia para poder usar polimorfismo caso necessário.
Outro ponto importante é usar genéricos para especializar sua lista.

[]'s

[quote=ViniGodoy]Para obter o nome da classe de um objeto:

obj.getClass().getName();

Mas também reforço o que o David falou. Geralmente, um ArrayList contém variáveis apenas de um tipo, ou filhos de um tipo. É importante saber o que esperar do get, sem ficar testando coisas. E o ideal é declara-lo já indicando esse tipo:

List&lt;String&gt; lista = new ArrayList&lt;String&gt;();

Como seria declarar para um ArrayList para manipular mais de um tipo de variável? se colocar [color=red] List lista = new ArrayList();[/color][color=#444444] funciona? No caso de eu precisar adicionar ao ArrayList uma variável String,int e char. Como eu faria?
Vi algo também declarando Object (Ex:[/color] [color=red]List <Object> lista = new ArrayList <Object>();[/color] [color=#444444] ) o que seria o Object?
No caso de mais de uma variável tenho algo aqui declarando[/color] [color=red] List <Pessoa> lista = new ArrayList<Pessoa>();[/color][color=#444444]
Pessoa no caso é uma outra classe, que guarda os dados de pessoa.[/color]

V

O ArrayList vai permitir variáveis de um tipo, ou dos filhos dele. Se você quiser o ArrayList mais abrangente de todos, basta criar um ArrayList<Object>():

List&lt;Object&gt; lista = new ArrayList&lt;&gt;();

Isso permitirá que você insira tipos diversos, por exemplo:

list.add(&quot;Olá!&quot;); list.add(Integer.valueOf(1000)); list.add(new MeuObjeto());

Entretanto, isso torna o uso da lista inconveniente, já que você terá que testar o tipo específico:

if (list.get(0) instanceof Integer) { //Faz algo }

E, portanto, é uma má prática. Se você está sentindo essa necessidade, reveja a modelagem do seu sistema, pois está problemática.

Na verdade, colocar o tipo entre as <> foi um recurso que surgiu no Java 5, justamente porque antes, todas as listas se comportavam como se fossem List().

L

obrigado ViniGodoy, é que estou começando a estudar ArrayList e surgem muitas dúvidas. Estou usando ArrayList para cadastro de pessoas em um formulário a melhor prática então seria um ArrayList para cada tipo de dado? Por exemplo estou criando uma rede social fictícia para um projeto da faculdade tenho uma classe cadastroPessoa com o JFrame do formulário com todos botões,objetos e eventos sendo ligada a outra classe pessoaFisica com os atributos e métodos de uma pessoa. No meu caso é melhor o ArrayList estar na classe cadastroPessoa junto com o JFrame e os eventos ou em pessoaFisica junto com os dados, atributos e métodos?

Por enquanto esta instanciado na classe cadastroPessoa junto com o JFrame da seguinte forma:

List &lt;pessoaFisica&gt; cadastroPf = new ArrayList &lt;pessoaFisica&gt; ();

que se não me engano seria um objeto estático certo?

e logo abaixo:

cadastroPf.add(new pessoaFisica (datnasc,sex,cepe,reg,end,numc,cid, est,tel,cel,face,twi,rep));

seria esse o modo mais correto de se fazer essa transição de dados? ou enviando ao método construtor da classe pessoaFisica?

ViniGodoy:
Entretanto, isso torna o uso da lista inconveniente, já que você terá que testar o tipo específico:

if (list.get(0) instanceof Integer) { //Faz algo }


O que seria tornar o uso da lista inconveniente?

Desde já, obrigado pela atenção Vini!

Criado 21 de janeiro de 2012
Ultima resposta 10 de mar. de 2015
Respostas 5
Participantes 4