Estou com a seguinte dúvida, tenho uma ArrayList genérica:
ArrayList lista = new ArrayList();
Essa lista acomodará Strings e ArrayLists. Explicando melhor, vou inserir uma String
lista.add("bla");
E às vezes será necessário inserir um ArrayList, dentro do ArrayList genérico, por exemplo:
ArrayList<String> listaStrings = new ArrayList<String>();
listaStrings.add("abc");
listaStrings.add("cachorro");
listaStrings.add("mamão");
lista.add(listaStrings);
Até aí, sem problemas, consigo inserir na boa. O problema é na hora de recuperar os itens. Tentei da seguinte maneira:
for (Object o : lista){
System.out.println(o);
}
Eu consigo obter os elementos, mas preciso “retirar” o ArrayList, que está misturado no meio das Strings, seria mais ou menos essa situação:
"bla" -> ["abc" -> "cachorro" -> "mamao"]
No exemplo fica claro que o outro Array está na útilma posição, mas no meu problema não tem como saber onde ele está. A questão é: teria como eu identificar onde está o ArrayList? Algo como
for (Object o : lista){
if (o é um ArrayList<String>){
//faz alguma coisa
}
}
Ou tem algum jeito mais fácil de fazer isso?
Agradeço antecipadamente, e desculpem se escrevi alguma besteira, sou novo em Java .
instanceof é seu amigo… mas você ainda vai ter de pôr um “@SuppressWarnings (“unchecked”)” no seu código também.
import java.util.*;
class TesteMultiArray {
@SuppressWarnings ("unchecked")
public static void main(String[] args) {
// Infelizmente não existe uma declaração como "new ArrayList<String | List><String>>", que aceite
// somente String ou List<String>. Portanto tenho de usar Object e aceitar qualquer Object.
// Isso vai acarretar um problema abaixo, que é o de ter de efetuar um cast inseguro.
List<Object> lista = new ArrayList<Object>();
lista.add ("bla");
List<String> subLista = new ArrayList<String>();
subLista.add ("ble");
subLista.add ("bli");
lista.add (subLista);
for (Object o : lista) {
if (o instanceof List) {
// este é o cast "inseguro".
for (String s: (List<String>)o) { // dá "warning: [unchecked] unchecked cast"
System.out.print(s + ",");
}
System.out.println ();
} else {
String s = (String) o;
System.out.println ("s=" + s);
}
}
}
}
Olá Luizão!
A solução no teu caso não é trivial porque o teu problema não é trivial…
Será que não seria mais apropriado, ao invés de inserir um ArrayList dentro de outro ArrayList, vc inserir no ArrayList apenas os elementos do ArrayList? Pense nisso, ok?
Como eu disse, a solução pro teu caso, do jeito que tá, é mais ou menos aquela que vc postou mesmo:
Mantu, o problema de colocar todas as strings no mesmo array é que irria misturar strings que não podem ser misturadas, e eu perderia totalmente o controle da aplicação. É difícil explicar porque eu preciso fazer isso, mas pra dar uma idéia, estou fazendo um compilador .
Eu já tinha tentado com o instanceof, porém eu estava fazendo
if (o instanceof ArrayList<String>)
E estava dando erro na tipagem… a mensagem de erro passou meio batida… Problema resolvido, valeu pela ajuda :).
thingol, qual a razão de colocar um “@SuppressWarnings (“unchecked”)”? É apenas um warning? Teria alguma documentação sobre o assunto pra indicar?