Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Преобразование массивов к новому типу


Автор: Aprol 12.3.2009, 14:32
Есть такой вот массив строк:
String[] arr=.....;
Нужно создать другой массив, той же размерности  и по необходимости использовать новый тип массива.
В итоге должен быть Integer[],Double[],String[] И т.д.
Создать новый массив нужной размерности и типа вроде не проблема:
Код

.....
String[] arr=new String[10];
......................
Class cls=Class.forName("<нужный класс элементов массива>");
Object newArray=Array.newInstance(cls,Array.getlength(arr));
 ..........

Получу в итоге например Integer[],а как теперь заполнить newArray значениями из arr?
Можно конечно наплодить кучу условий instanceof и в зависимости от них приводить типы:
Код

if (newArray instanceof Integer[]){
for(int i=0;i<Array.getlength(newArray);i++){
int j=(Integer)arr[i];
Array.setInt(newArray,i,j);
}
}
 
Ну и в таком духе для каждого типа, но имхо как то криво.
И как это преобразовать под матрицы?

Автор: ivg 12.3.2009, 16:44
Грамотное применение идей http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_%D0%B2_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0%D1%85_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F решает большую часть подобного рода проблем. smile

Автор: Platon 12.3.2009, 17:04
ivg, полностью согласен.
Правда, могу сделать предложение для простоты - скакать от String, т.е. приводить все типы к строке, а потом к нужному типа.

Автор: LSD 12.3.2009, 17:35
Цитата(Aprol @  12.3.2009,  14:32 Найти цитируемый пост)
Получу в итоге например Integer[],а как теперь заполнить newArray значениями из arr?
Можно конечно наплодить кучу условий instanceof и в зависимости от них приводить типы:

А как ты вообще, из String собираешься получать Integer, Double и т.д.? У тебя есть некий универсальный конвертер, который может из строки получить произвольный тип?

Автор: Aprol 13.3.2009, 04:06
Цитата(LSD @  12.3.2009,  17:35 Найти цитируемый пост)
А как ты вообще, из String собираешься получать Integer, Double и т.д.?

А разве вот этот код не позволит мне создать массив требуемого типа?:

Код

Class cls=Class.forName("<нужный класс элементов массива>");
Object newArray=Array.newInstance(cls,Array.getlength(arr));

Класс элементов то я знаю...
Цитата(Platon @  12.3.2009,  17:04 Найти цитируемый пост)
приводить все типы к строке, а потом к нужному типа

Наверное криво объяснил, но изначально есть String[] кот. содержит строки, вот их то и нужно привести к новому классу.
String[] приходит из HttpServletRequest
.......................................
Код

Map param_map = request.getParameterMap();
Iterator iterator = param_map.entrySet().iterator();
while (iterator.hasNext()) {
......................................
Map.Entry me = (Map.Entry) iterator.next();
........................................
String[] arr = (String[]) me.getValue();}

Вот он и String[] который содержит значения параметров формы, они всегда будут приходить в виде строк.
Есть еще бизнес-логика в ней уже используются конкретные массивы Integer[],Double[] и т.д. Хранятся эти массивы в Object.
Такая последовательность получается:
получаю String[]->получение нового массива->сохранение нового массива в Object->
Поэтому мне нужно превести массив String[] в нужный массив. При этом какой класс я знаю(указан ввиде строки).

Автор: math64 13.3.2009, 09:43
Если у теба используются Double, Integer ... а не double, int ..., для каждого используемого типа нужно создать фабрику, создающую объект нужного типа из строки.
В случае 2-, 3- мерного массива элементы массива будут массивами.
Тип элемента массива можно получить так:
Код

  Class doubleArrayClass =  new Double[0][0].getClass().getComponentType();

Автор: LSD 13.3.2009, 12:57
Цитата(Aprol @  13.3.2009,  04:06 Найти цитируемый пост)
А разве вот этот код не позволит мне создать массив требуемого типа?

Массив - позволит. А дальше тебе нужно будет как-то разбираться с элементами этих массивов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)