2013-08-03 5 views
7

Я хочу создать Arraylist, который должен содержать целые числа и строки. Возможно ли это?Arraylist, содержащий целые числа и строки

Я создал два Список_массивов, как указано ниже:

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

Я хочу поставить IntList & strList в новый ArrayList.

Могу ли я это сделать ?? Если да, то как?

+6

Да, вы можете создать 'ArrayList ', но, сказав это, мой совет для вас таков: не надо. Не создавайте списки со смешанными типами, так как это говорит о том, что ваш дизайн программы нарушен и нуждается в улучшении, чтобы этот монстр не нужен. –

+2

Почему вы хотите смешивать два разных типа в одном массиве ArrayList? –

+0

Существуют ли зависимости между этими двумя списками? –

ответ

7

Вы можете сделать это следующим образом, но придется отказаться от дженериков для контейнера списка.

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

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

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

Но, лучше всего было бы использовать Map для отслеживания двух списков, так как компилятор больше не сможет помешать вам смешивания типов, как положить строку в список 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

raw types = bad – newacct

5

Если этого избежать, пожалуйста, избегайте этого списка Тип объекта. Перейдите для отдельных списков.

Если нет, то вы должны пойти для типа Object

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

, которые принимают все объекты типа, но должны позаботиться при получении.

Проверка объектов при получении

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

Я не могу понять, почему вы так злитесь? Он просто задает вопрос, и я даю правильный ответ. Опасная сторона этого решения - еще одна проблема. –

+0

Я не сержусь. Но мне не нравятся плохие советы, даваемые в качестве ответов. –

2

Вы можете использовать маркированные типы сумм: Either<A, B> является либо Left<A, B> или Right<A, B>. В Java это будет выглядеть следующим образом:

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

Таким образом, вы можете использовать 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; 
    } 
} 

Этот подход более безопасен по типу, чем при использовании Object.

Смежные вопросы