2013-08-03 14 views
7

Chcę utworzyć listę znaków, która powinna zawierać liczby całkowite i łańcuchy znaków. Czy to możliwe?Arraylist zawierające liczby całkowite i łańcuchy znaków

Stworzyłem dwa ArrayList, jak podano poniżej:

ArrayList<Integer> intList=new ArrayList<Integer>(); 
    intList.add(1); 
    intList.add(2); 

ArrayList<String> strList=new ArrayList<String>(); 
    strList.add("India"); 
    strList.add("USA"); 
    strList.add("Canada"); 

chcę umieścić intList & strList do nowego ArrayList.

Czy mogę to zrobić? Jeśli tak to jak??

+6

Tak, możesz utworzyć "ArrayList ", ale mówiąc to, moja rada dla Ciebie brzmi: nie rób tego. Nie twórz list o różnych typach, ponieważ sugeruje to, że projekt twojego programu jest uszkodzony i wymaga ulepszenia, aby tego rodzaju potwór nie był potrzebny. –

+2

Dlaczego chcesz mieszać dwa różne typy w jednym ArrayList? –

+0

Czy są jakieś zależności między tymi dwoma listami? –

Odpowiedz

7

Można to zrobić w następujący sposób, ale musiał zrezygnować z leków generycznych dla kontenera listy.

List<List> listOfMixedTypes = new ArrayList<List>(); 

ArrayList<String> listOfStrings = new ArrayList<String>(); 
ArrayList<Integer> listOfIntegers = new ArrayList<Integer>(); 

listOfMixedTypes.add(listOfStrings); 
listOfMixedTypes.add(listOfIntegers); 

Ale lepszym sposobem byłoby użyć Map śledzić dwóch list, ponieważ kompilator nie będzie już w stanie uniemożliwić mieszanie rodzajów jak oddanie ciąg na liście Integer.

Map<String, List> mapOfLists = new HashMap<String, List>(); 

mapOfLists.put("strings", listOfStrings); 
mapOfLists.put("integers", listOfIntegers); 

mapOfLists.get("strings").add("value"); 
mapOfLists.get("integers").add(new Integer(10)); 
+1

typy raw = bad – newacct

5

Jeśli można tego uniknąć, proszę unikać tej listy typów obiektów. Idź do poszczególnych list.

Jeśli nie, to należy udać się do rodzaju Object

List<Object> list = new ArrayList<Object>(); 

które akceptują wszystkie typu obiektów, ale trzeba dbać podczas pobierania.

Kontrola obiektów podczas pobierania

for (Object obj: list) { 
    if (obj instanceof String){ 
     // this is string 
    } else if (obj instanceof Integer) { 
     // this is Integer 
    } 
} 
2
List<Object> oList=new ArrayList<Object>(); 
+1

Nie mogę zrozumieć, dlaczego jesteś taki zły? On po prostu zadaje pytanie, a ja podaję właściwą odpowiedź. Niebezpieczna strona tego rozwiązania to inna kwestia. –

+0

Nie jestem zły. Ale nie podoba mi się zła rada udzielona jako odpowiedź. –

2

Można użyć oznaczone rodzaje sum: Either<A, B> jest albo Left<A, B> lub Right<A, B>. W Javie będzie to wyglądać następująco:

public interface Either<A, B>; 
public class Left<A, B> implements Either<A, B> { 
    public final A value; 
    public Left(A value) { 
    this.value = value; 
    } 
} 
public class Right<A, B> implements Either<A, B> { 
    public final B value; 
    public Right(B value) { 
    this.value = value; 
    } 
} 

Można więc użyć ArrayList<Either<Integer, String>>.

for (Either<Integer, String> either : intsOrStrings) { 
    if (either instanceof Left) { 
    Integer i = ((Left<Integer, String>) either).value; 
    } else if (either instanceof Right) { 
    String s = ((Right<Integer, String>) either).value; 
    } 
} 

Takie podejście jest bardziej bezpieczne dla typu niż przy użyciu Object.

Powiązane problemy