2013-08-03 37 views
7

Tôi muốn tạo một Arraylist có chứa số nguyên và chuỗi .. Có thể không?Arraylist chứa số nguyên và chuỗi

Tôi đã tạo ra hai ArrayList như đưa ra dưới đây:

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"); 

Tôi muốn đặt intList & strList thành một ArrayList mới.

Tôi có thể làm điều đó không ?? Nếu vậy, Làm thế nào ??

+6

Vâng, bạn có thể tạo một 'ArrayList 'nhưng có nói rằng, lời khuyên của tôi cho bạn là: không. Không tạo danh sách với các loại hỗn hợp vì điều này cho thấy rằng thiết kế chương trình của bạn bị hỏng và cần được cải thiện để loại quái vật này không cần thiết. –

+2

Tại sao bạn muốn kết hợp hai loại khác nhau trong một ArrayList đơn lẻ? –

+0

Có bất kỳ sự phụ thuộc nào giữa hai Danh sách này không? –

Trả lời

7

Bạn có thể làm điều này như sau nhưng phải từ bỏ trên Generics cho container danh sách.

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

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

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

Nhưng, một cách tốt hơn là nên sử dụng một Map để theo dõi hai danh sách kể từ khi trình biên dịch sẽ không còn có thể ngăn cản bạn trộn các loại giống như đặt một String vào một danh sách 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

loại thô = xấu – newacct

5

Nếu có thể tránh được, vui lòng tránh danh sách loại đối tượng này. Đi cho từng danh sách.

Nếu không được thì bạn nên đi cho loại Object

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

mà chấp nhận tất cả các đối tượng loại, nhưng phải chăm sóc khi truy xuất.

Kiểm tra các đối tượng trong khi lấy

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

Tôi không thể hiểu tại sao bạn lại tức giận như vậy? Anh ấy chỉ hỏi một câu hỏi và tôi đưa ra câu trả lời đúng.Điểm nguy hiểm của giải pháp này là một vấn đề khác. –

+0

Tôi không tức giận. Nhưng tôi không thích lời khuyên xấu như là câu trả lời. –

2

Bạn có thể sử dụng loại tổng tagged: Either<A, B> là một trong hai Left<A, B> hoặc Right<A, B>. Trong Java, nó sẽ trông giống như:

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; 
    } 
} 

Vì vậy, bạn có thể sử dụng 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; 
    } 
} 

Cách tiếp cận này an toàn hơn loại sử dụng Object.

Các vấn đề liên quan