Зависит от Вашего поставщика базы данных. MySQL имеет concat_ws. SQL Server MS ожидает, что Вы сделаете это в своем клиентском приложении.
Обновление: Вы могли также сделать это во внешней процедуре или UDF, возможно, при помощи курсора или обращающегося кода CLR.
К сожалению, вам нужно будет перебрать весь список и распаковать Double
, если вы хотите преобразовать его в double []
.
] Что касается производительности, некоторое время связано с упаковкой и распаковкой примитивов в Java. Если набор достаточно мал, вы не увидите никаких проблем с производительностью.
Мне нечего добавить к настоящему вопросу, кроме того, что сказали jjnguy и Эрик Кослоу.
Но небольшое примечание: вы упомянули преобразование массива Object в массив Double. Следующее НЕ будет работать:
Object[] oa=new Object[3];
oa[0]=new Double("1.0");
oa[1]=new Double("2.0");
oa[2]=new Double("3.0");
Double[] da=(Double[])oa;
Последняя строка вызовет исключение приведения класса. Несмотря на то, что каждый элемент в массиве действительно является Double, массив был создан как массив объектов, а не как массив Double, поэтому приведение недопустимо.
Object[] oa=new Object[3];
oa[0]=new Double("1.0");
oa[1]=new Double("2.0");
oa[2]=new Double("3.0");
Double[] da=(Double[])oa;
Последняя строка вызовет исключение приведения класса. Несмотря на то, что каждый элемент в массиве действительно является Double, массив был создан как массив объектов, а не как массив Double, поэтому приведение недопустимо.
Object[] oa=new Object[3];
oa[0]=new Double("1.0");
oa[1]=new Double("2.0");
oa[2]=new Double("3.0");
Double[] da=(Double[])oa;
Последняя строка вызовет исключение приведения класса. Несмотря на то, что каждый элемент в массиве действительно является Double, массив был создан как массив объектов, а не как массив Double, поэтому приведение недопустимо.
Вы можете использовать a для каждого цикла, чтобы создать временный массив того же размера, затем привести каждый отдельный элемент к удвоению, но он находится в массиве.
SO:
double[] tempArray = new double[data[columnIndex].length];
int i = 0;
for(Double d : (Double) data[columnIndex]) {
tempArray[i] = (double) d;
i++;
}
Пожалуйста, исправьте меня, если я здесь совершенно не прав.
Если вы хотите вернуть double []
, вам нужно будет создать новый двойной []
, заполнить его и вернуть.
Это может быть хорошим архитектурным решением. Во-первых, не имеет большого смысла преобразовывать Object []
в Double []
; на самом деле это не массив Double
, потому что в нем также могут быть Object
. Во-вторых, если вы вернете массив напрямую, пользовательский код может изменить его и изменить внутреннюю структуру вашего объекта.
Основное влияние на производительность будет заключаться в возврате массива double []
,
If you don't mind using a 3rd party library, commons-lang has the ArrayUtils type with various methods for manipulation.
Double[] doubles;
...
double[] d = ArrayUtils.toPrimitive(doubles);
There is also the complementary method
doubles = ArrayUtils.toObject(d);
Edit: To answer the rest of the question. There will be some overhead to doing this, but unless the array is really big you shouldn't worry about it. Test it first to see if it is a problem before refactoring.
Implementing the method you had actually asked about would give something like this.
double[] getDoubles(int columnIndex) {
return ArrayUtils.toPrimitive(data[columnIndex]);
}
Я бы второй ArrayUtils ответьте и добавьте, что документация 1.5 autoboxing ( via ) как бы показывает, что нет встроенного способа:
Нет разрешенного преобразования из типа массива SC [] в массив типа TC [] если не разрешено преобразование кроме преобразования строки из SC в TC