Java'da nesne dizisini dize dizisine dönüştürme


244

Bir nesne dizisini bir String dizisine dönüştürmek için aşağıdaki kodu kullanın:

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();

Ama bunu yapmanın başka bir yolu olup olmadığını merak ediyorum:

String_Array=(String[])Object_Array;

Ancak bu bir çalışma zamanı hatasına neden olur: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

Bunu yapmanın doğru yolu nedir?


3
Ben waxwing en iyi cevap seviyorum: String [] stringArray = Arrays.copyOf (objectArray, objectArray.length, String []. Class); Çok özlü ve çalışıyor. Hem cevabı hem de mevcut yaklaşımım için ne kadar zaman harcadığını saydım, neredeyse aynılar.
Frank

Yanıtlar:


381

Başka bir alternatif System.arraycopy:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);

59
sadece Java 1.6 ve üstü
newacct

10
Hrm. Bunu orijinal sorudaki uzun form örneğinin işe yaradığı yerde çalıştıramadım. Java.lang.ArrayStoreException öğesini atar. Özel dizimi içeren genel bir ArrayList üzerinde toArray yönteminden nesne dizisini alıyorum. Bunun jeneriklerle veya başka bir şeyle çalışması beklenmiyor mu?
Ian Varley

4
@Ian, sorunu objectArray Nesneler Dizeleri içermiyor olmasıdır (aynı sorundan muzdarip cevabımın yorumuna bakınız).
Yishai

3
Sadece bu yaklaşımı denedim ve en azından benim durumumda, performansın yineleme yaparak diziyi kendim oluşturmak kadar iyi olmadığını öğrendim. (Çok kötü olsa da, bir astar olarak sevdim!)
mdup

1
mdup - oldukça uzun bir astar. belki bir yöntemle sarın.
MasterJoe2

72

Java 8'de:

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

Bir dizi başka türü dönüştürmek için:

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);

2
Bu bir güzellik çalışmasıdır ve String olmayan bir nesne dizisini estetik olarak toString eşdeğerlerinden oluşan bir diziye dönüştürme gereksinimini karşılar. Şu anda kabul edilen cevap bunu başaramıyor.
b4n4n4p4nd4

Bu işe yarar, ancak listenizde null varsa NullPointerException özelliğine sahip olursunuz. Bu sorunu
çözmek için

61

System.arraycopy muhtemelen en etkili yoldur, ancak estetik için tercih ederim:

 Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);

10
Bu yalnızca nesnelerin tümü Dizeler ise işe yarar; mevcut kodu olmasa bile çalışır.
Michael Myers

İyi bir nokta. Ben toString aslında sadece başka bir şey ile nesneleri değiştirmek niyetinde değil, bir String döküm yolu olarak anladım. Yapmanız gereken şey buysa, döngü tek yoldur.
Yishai

bu Android 2.3.3 sürümünde çalışmıyor. bana copyof yönteminin tanımlanmadığını söyleyen bir hata veriyor. Tüm doğru dosyaları içe aktardım (ctrl + shift + I) .. ama yine de çalışmıyor.
user590849

3
@ user590849, cevabım kullanmıyor copyof. Başka bir cevaba mı atıfta bulunuyorsunuz?
Yishai

50

Bazı çözümlerin sağlandığını görüyorum, ancak herhangi bir neden yok, bu yüzden, verilen cevaplardan işe yarayan "bir şey" almanın neyi yanlış yaptığınızı bilmenin önemli olduğuna inandığım için ayrıntılı olarak açıklayacağım.

İlk olarak, Oracle'ın ne söylediğine bakalım

 * <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.

Önemli görünmeyebilir, ancak göreceğiniz gibi ... Peki aşağıdaki satır başarısız olur? Listedeki tüm nesneler Dize'dir ancak bunları dönüştürmez, neden?

List<String> tList = new ArrayList<String>();
tList.add("4");
tList.add("5");
String tArray[] = (String[]) tList.toArray();   

Muhtemelen, birçoğunuz bu kodun aynı şeyi yaptığını düşünürsünüz, ama yapmaz.

Object tSObjectArray[] = new String[2];
String tStringArray[] = (String[]) tSObjectArray;

Gerçekte yazılı kod böyle bir şey yapıyorsa. Javadoc bunu söylüyor! Nesnelerin ne olacağını, yeni bir dizi instatiate olacak !!!

Object tSObjectArray[] = new Object[2];
String tStringArray[] = (String[]) tSObjectArray;   

Yani tList.toArray, Dizeleri değil Nesneleri somutlaştırıyor ...

Bu nedenle, bu konuya değinilmeyen doğal çözüm, ancak Oracle'ın önerdiği şey şudur:

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

Umarım yeterince açıktır.


Hafif düzeltme performansı akıllıca: String tArray [] = tList.toArray (new String [tList.size ()]); Aksi takdirde dizinin yeniden boyutlandırılması gerekir ...
Lonzak

1
İyi açıklama. Sadece bir şey daha, bellek tüketimi veya performans bir sorunsa, diziyi çoğaltmayın. İhtiyacınız olduğunda Ya dize bir öğeyi döküm (String)Object_Array[i]veya Object_Array[i].toString()veya String dizi olarak dizi tahsis Object Object_Array[]=new String[100];değerleri almak ... sonra dökme ... String_Array=(String[])Object_Arrayşimdi çalışıyor ki.
Solostaran14

1
bu atar ArrayStoreException
iltaf khalid

7

Google koleksiyonları çerçevesi iyi bir dönüşüm yöntemi sunar, böylece Nesnelerinizi Dizelere dönüştürebilirsiniz. Tek dezavantajı, yinelenebilir yinelenebilir olması gerekiyor ama bunu yapmanın yolu budur:

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();
        }
 });

Bu sizi dizileri kullanmaktan uzaklaştırıyor, ama bence bu benim tercih ettiğim yol.


1
@Yishai: hayır, diziler Yinelenebilir uygulamaz. bunların üzerinde yineleme
JLS'de

@newacct, oldukça doğru, dizilerin bir Tekrarlanabilir (Arrays.asList ()) içine kolayca sarılabileceğini söyledim. Neden bu şekilde ortaya çıktığını bilmiyorum.
Yishai

5

Dizinizdeki nesnelerin String temsilini almak istiyorsanız, evet, bunu yapmanın başka bir yolu yoktur.

Object dizinizin yalnızca Dizeler içerdiğini biliyorsanız, şunları da yapabilirsiniz (toString () çağrısının instread):

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

Object_Array öğesinin cast to String [] işlevini kullanabileceğiniz tek durum, başvurduğu dizinin aslında String [] olarak tanımlanmasıdır, örneğin bu işe yarar:

    Object[] o = new String[10];
    String[] s = (String[]) o;

5

Bu güzel, ancak köşeli parantez nedeniyle mmyers'ın fark ettiği gibi çalışmıyor:

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

Bu çirkin ama çalışıyor:

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

Bu kodu kullanırsanız, nesnelerinizin toString () tarafından döndürülen dizelerin virgül içermediğinden emin olmalısınız.


1
İlginç bir öneri, ancak önce ilk ve son öğelerin [ve] öğelerini kaldırmanız gerekir.
Michael Myers

1
işi gerçekleştirene kadar muhteşem :)
AZ_

2
Herhangi bir Dize virgül içeriyorsa bu işe yaramaz (,)
Andreas Berger

2

Fikriniz için, aslında başarıya yaklaşıyorsunuz, ancak bunu isterseniz iyi olur:

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

BTW, Arrays yardımcı yöntemini kullanarak oldukça iyidir ve kodu zarif hale getirir.


1
Object arr3[]=list1.toArray();
   String common[]=new String[arr3.length];

   for (int i=0;i<arr3.length;i++) 
   {
   common[i]=(String)arr3[i];
  }

1

Tip dönüştürücüyü kullanabilirsiniz . Herhangi bir tür diziyi dize dizisine dönüştürmek için kendi dönüştürücünüzü kaydedebilirsiniz:

 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;
        }
    });

ve kullan

   Object[] objects = new Object[] {1, 23.43, true, "text", 'c'};
   String[] strings = TypeConverter.convert(objects, String[].class);

0

Herhangi bir başlık olmadan kolayca değiştirin Herhangi bir nesne dizisini dize dizisine dönüştürün Object drivex [] = {1,2};

    for(int i=0; i<drive.length ; i++)
        {
            Str[i]= drivex[i].toString();
            System.out.println(Str[i]); 
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.