Как преобразовать массив объектов в массив строк в Java
Я использую следующий код для преобразования массива объектов в массив строк:
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;
Как правильно это сделать ?
11 ответов:
еще одна альтернатива
System.arraycopy:String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
Я вижу, что некоторые решения были предоставлены, но не какие-либо причины, поэтому я объясню это подробно, поскольку я считаю, что так же важно знать, что вы делаете неправильно, чтобы просто получить "что-то", которое работает из данных ответов.
во-первых, давайте посмотрим, что оракул скажет
* <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.это может не выглядеть важным, но, как вы увидите, это так... Так что же следующая строка терпит неудачу? Все объекты в списке являются строковыми, но он не преобразует их, зачем?
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;когда на самом деле написанный код делает что-то вроде этого. Документация javadoc говорит он! Он установит новый массив, какой он будет из объектов!!!
Object tSObjectArray[] = new Object[2]; String tStringArray[] = (String[]) tSObjectArray;Итак, список задач.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 collections предлагает хороший метод преобразования, поэтому вы можете преобразовать свои объекты в строки. Единственным недостатком является то, что он должен быть от итерации к итерации, но это так, как я бы это сделал:
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]; }
можно использовать тип-конвертер. Для преобразования массива любых типов в массив строк, вы можете зарегистрировать свой собственный конвертер:
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);
легко изменить без каких-либо headche Преобразование любого массива объектов в массив строк Объект drivex[] = {1,2};
for(int i=0; i<drive.length ; i++) { Str[i]= drivex[i].toString(); System.out.println(Str[i]); }
Comments