Ответ 1
Другая альтернатива System.arraycopy
:
String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
Я использую следующий код для преобразования массива Object в массив String:
Object Object_Array[]=new Object[100];
// ... get values in the Object_Array
String String_Array[]=new String[Object_Array.length];
for (int i=0;i<String_Array.length;i++) String_Array[i]=Object_Array[i].toString();
Но мне интересно, есть ли другой способ сделать это, например:
String_Array=(String[])Object_Array;
Но это вызовет ошибку времени выполнения: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
Какой правильный способ сделать это?
Другая альтернатива System.arraycopy
:
String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
System.arraycopy, вероятно, самый эффективный способ, но для эстетики я бы предпочел:
Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);
Я вижу, что некоторые решения были предоставлены, но не какие-либо причины, поэтому я объясню это подробно, поскольку считаю, что важно знать, что вы делаете неправильно, чтобы просто получить "что-то", которое работает с данными ответами.
Во-первых, посмотрим, что Oracle должен сказать
* <p>The returned array will be "safe" in that no references to it are
* maintained by this list. (In other words, this method must
* allocate a new array even if this list is backed by an array).
* The caller is thus free to modify the returned array.
Это может показаться неважным, но, как вы увидите, это так... Итак, что происходит в следующей строке? Весь объект в списке - String, но он не преобразует их, почему?
List<String> tList = new ArrayList<String>();
tList.add("4");
tList.add("5");
String tArray[] = (String[]) tList.toArray();
Возможно, многие из вас подумают, что этот код делает то же самое, но это не так.
Object tSObjectArray[] = new String[2];
String tStringArray[] = (String[]) tSObjectArray;
Когда на самом деле письменный код делает что-то вроде этого. Джавадок говорит это! Он установит новый массив, что будет из объектов!!!
Object tSObjectArray[] = new Object[2];
String tStringArray[] = (String[]) tSObjectArray;
Так что tList.toArray создает объекты, а не строки...
Следовательно, естественное решение, которое не упоминалось в этом потоке, но это то, о чем рекомендует Oracle следующее
String tArray[] = tList.toArray(new String[0]);
Надеюсь, что это достаточно ясно.
В Java 8:
String[] strings = Arrays.stream(objects).toArray(String[]::new);
Для преобразования массива других типов:
String[] strings = Arrays.stream(obj).map(Object::toString).
toArray(String[]::new);
Рамка Google maps предлагает цитату хорошего метода преобразования, поэтому вы можете преобразовать объекты в строки. Единственный недостаток заключается в том, что он должен быть от Iterable до Iterable, но это так, как я бы это сделал:
Iterable<Object> objects = ....... //Your chosen iterable here
Iterable<String> strings = com.google.common.collect.Iterables.transform(objects, new Function<Object, String>(){
String apply(Object from){
return from.toString();
}
});
Это уберет вас от использования массивов, но я думаю, что это будет мой предпочтительный путь.
Если вы хотите получить строковое представление объектов в своем массиве, то да, другого способа сделать это не будет.
Если вы знаете, что в вашем массиве объектов содержатся только строки, вы также можете сделать (instread для вызова toString()):
for (int i=0;i<String_Array.length;i++) String_Array[i]= (String) Object_Array[i];
Единственный случай, когда вы могли бы использовать приведение в String [] объекта Object_Array, было бы, если массив, на который он ссылается, фактически будет определен как String [], например. это будет работать:
Object[] o = new String[10];
String[] s = (String[]) o;
Это хорошо, но не работает, как заметили mmyers из-за квадратных скобок:
Arrays.toString(objectArray).split(",")
Этот уродливый, но работает:
Arrays.toString(objectArray).replaceFirst("^\\[", "").replaceFirst("\\]$", "").split(",")
Если вы используете этот код, вы должны быть уверены, что строки, возвращаемые объектами 'toString(), не содержат запятых.
Для вашей идеи, на самом деле вы приближаетесь к успеху, но если вы делаете это, все должно быть хорошо:
for (int i=0;i<String_Array.length;i++) String_Array[i]=(String)Object_Array[i];
Кстати, использование утилиты Arrays довольно неплохо и делает код элегантным.
Object arr3[]=list1.toArray();
String common[]=new String[arr3.length];
for (int i=0;i<arr3.length;i++)
{
common[i]=(String)arr3[i];
}
Вы можете использовать type-converter. Чтобы преобразовать массив любых типов в массив строк, вы можете зарегистрировать собственный конвертер:
TypeConverter.registerConverter(Object[].class, String[].class, new Converter<Object[], String[]>() {
@Override
public String[] convert(Object[] source) {
String[] strings = new String[source.length];
for(int i = 0; i < source.length ; i++) {
strings[i] = source[i].toString();
}
return strings;
}
});
и используйте его
Object[] objects = new Object[] {1, 23.43, true, "text", 'c'};
String[] strings = TypeConverter.convert(objects, String[].class);
Легко менять без каких-либо головных уборов Преобразование любого массива объектов в массив строк Object drivex [] = {1,2};
for(int i=0; i<drive.length ; i++)
{
Str[i]= drivex[i].toString();
System.out.println(Str[i]);
}