2011-12-27 4 views
0

Учитывая 3 переменные (homeNumber, mobileNumber и workNumber), которые могут быть нулевыми, но по крайней мере один из них будет String, мне нужно вернуть массив String, чтобы впоследствии использовать его на Android Диалог. У меня проблемы с этим. Я попытался сделать это в ArrayList и удалить все нулевые элементы, что оставляет ArrayList только с строками, как я хочу, но при попытке изменить его на массив я получаю исключение ClassCast в последней строке.ArrayList для String Array

ArrayList numberList = new ArrayList(); 
numberList.add(homeNumber); 
numberList.add(mobileNumber); 
numberList.add(workNumber); 
numberList.removeAll(Collections.singleton(null)); 

final String[] items= (String[]) numberList.toArray(); 

Любые идеи, как исправить это?

+2

Вы должны проверить I f данные, которые вы добавляете в ваш arraylist, равны нулю, прежде чем вставлять их. Почему вы хотите преобразовать ArrayList в String Array? Почему вы не строите ArrayList ? –

+0

Вы не можете передавать не общий ArrayList в массив данного объекта, поскольку он может содержать объекты разных классов. Учитывая тот факт, что это код Android, почему бы не использовать дженерики, как заявил Джереми выше? –

ответ

8
String[] items = new String[numberList.size()]; 
numberList.toArray(items); 
+0

, или вам нужно пройти через список и заполнить String [] путем увеличения индекса массива. Вы не можете напрямую делать финальные строки [] items = (String []) numberList.toArray(); потому что возвращаемый тип toArray является объектом [] – kosa

0

Тип возврата ArrayList.toArray() - Object [], если вы не передадите массив в качестве первого аргумента. В этом случае тип возврата имеет тот же тип, что и переданный массив, и если массив достаточно велик, он используется. Сделайте это:

final String[] items= (String[])numberList.toArray(new String[3]) 
+0

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

0

Изменить

ArrayList numberList = new ArrayList(); 

в

List<String> numberList = new ArrayList<String>(); 
0

использовать другой метод toArray() класса List:

numberList.toArray(new String[numberList.size()]); 
+0

Это будет работать, если вы используете его в качестве аргумента для чего-то вроде адаптера (его то, что я делаю), но если вы хотите, чтобы массив продолжал проходить мимо этой строки кода, вам нужно создать экземпляр это отдельно. – Pyrodante

+0

Возврат метода - это точно созданный массив. Он может назначить его 'String [] items' –

1

Вы можете сделать одну из двух вещей:

Пасса в типе массива вы хотите получить (нет необходимости создавать экземпляр полного массива длиной, производительность же, независимо):

final String[] items= (String[]) numberList.toArray(new String[0]); 

Однако, лучшим решением является использование генериков:

List<String> numberList = new ArrayList<String>(); 

final String[] items= (String[]) numberList.toArray(); 
Смежные вопросы