Как преобразовать массив объектов в массив строк в Java - PullRequest
229 голосов
/ 19 июня 2009

Я использую следующий код для преобразования массива 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;

Какой правильный способ сделать это?

Ответы [ 11 ]

360 голосов
/ 19 июня 2009

Другая альтернатива System.arraycopy:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
57 голосов
/ 20 апреля 2014

В Java 8:

String[] strings = Arrays.stream(objects).toArray(String[]::new);

Чтобы преобразовать массив других типов:

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);
57 голосов
/ 19 июня 2009

System.arraycopy, вероятно, самый эффективный способ, но для эстетики я бы предпочел:

 Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);
49 голосов
/ 30 ноября 2012

Я вижу, что были предоставлены некоторые решения, но не какие-либо причины, поэтому я объясню это подробно, так как считаю, что так же важно знать, что вы делали неправильно, просто чтобы получить «что-то», которое работает из данных ответов.

Сначала давайте посмотрим, что 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.

Это может выглядеть неважно, но, как вы увидите, это так ... Так что же не получается в следующей строке? Все объекты в списке являются строковыми, но он не преобразует их, почему?

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;   

Итак, tList.toArray создает экземпляры объектов, а не строк ...

Следовательно, естественное решение, которое не упоминалось в этой теме, но Oracle рекомендует следующее:

String tArray[] = tList.toArray(new String[0]);

Надеюсь, это достаточно ясно.

7 голосов
/ 19 июня 2009

Фреймворк коллекций Google предлагает хороший метод преобразования, так что вы можете преобразовать свои объекты в строки. Единственным недостатком является то, что он должен быть из 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();
        }
 });

Это отвлекает вас от использования массивов, но я думаю, что это будет моим предпочтительным способом.

5 голосов
/ 19 июня 2009

Это хорошо, но не работает, как заметил ммайерс, из-за квадратных скобок:

Arrays.toString(objectArray).split(",")

Этот уродлив, но работает:

Arrays.toString(objectArray).replaceFirst("^\\[", "").replaceFirst("\\]$", "").split(",")

Если вы используете этот код, вы должны быть уверены, что строки, возвращаемые toString () ваших объектов, не содержат запятых.

5 голосов
/ 19 июня 2009

Если вы хотите получить строковое представление объектов в вашем массиве, то да, другого способа сделать это не существует.

Если вы знаете, что ваш массив Object содержит только строки, вы также можете сделать это (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;
2 голосов
/ 24 ноября 2011

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

for (int i=0;i<String_Array.length;i++) String_Array[i]=(String)Object_Array[i];

Кстати, использование утилиты Arrays весьма неплохо и делает код элегантным.

1 голос
/ 23 мая 2015

Вы можете использовать Тип-преобразователь . Для преобразования массива любых типов в массив строк вы можете зарегистрировать свой собственный конвертер:

 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);
1 голос
/ 07 января 2015
Object arr3[]=list1.toArray();
   String common[]=new String[arr3.length];

   for (int i=0;i<arr3.length;i++) 
   {
   common[i]=(String)arr3[i];
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...