Javaでオブジェクト配列を文字列配列に変換する方法


244

次のコードを使用して、オブジェクト配列を文字列配列に変換します。

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;

それを行う正しい方法は何ですか?


3
私はワックスウィングの答えが一番好きです:String [] stringArray = Arrays.copyOf(objectArray、objectArray.length、String []。class); それは非常に簡潔で機能します。私は彼の答えと私の現在のアプローチの両方にかかる時間を数えました、それらはほとんど同じです。
フランク

回答:


381

への別の代替System.arraycopy

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

59
唯一のJava 1.6で、上
newacct

10
Hrm。これを機能させることができませんでした。元の質問の長い形式の例が機能します。java.lang.ArrayStoreExceptionをスローします。カスタム配列を含むジェネリックArrayListのtoArrayメソッドからオブジェクト配列を取得しています。これはジェネリックなどで動作することを期待されていませんか?
Ian Varley、2010

4
@Ian、問題は、objectArrayに文字列ではなくオブジェクトが含まれていることです(同じ問題に悩まされている私の回答に対するmmyersのコメントを参照してください)。
Yishai

3
私はこのアプローチを試したところ、少なくとも私の場合は、反復してアレイを自分で構築するほどパフォーマンスが良くないことがわかりました。(残念ながら、ワンライナーとして気に入った!)
mdup

1
@mdup-かなり長いライナー。おそらくそれをメソッドにラップします。
MasterJoe2 2016

72

Java 8の場合:

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

他のタイプの配列を変換するには:

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

2
これは美しさの産物であり、非文字列オブジェクト配列をtoStringに相当する配列に美的に変換できるという要件を満たします。現在受け入れられている答えはこれを達成しません。
b4n4n4p4nd4

これは機能しますが、リストにnullが含まれている場合は、NullPointerExceptionが発生します。この問題を回避するには、stackoverflow.com
questions / 4581407 /…を

61

System.arraycopyはおそらく最も効率的な方法ですが、美的感覚のために、私は次のように好みます。

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

10
これは、オブジェクトがすべて文字列の場合にのみ機能します。彼の現在のコードは、そうでない場合でも機能します。
マイケル・マイヤーズ

いい視点ね。私はtoStringを単なるStringへのキャスト方法であると理解しました。実際にオブジェクトを他のもので置き換えるつもりはありません。それが必要な場合は、ループが唯一の方法です。
Yishai、

これはAndroid 2.3.3では機能しません。copyofメソッドが定義されていないというエラーが表示されます。正しいファイルをすべてインポートしました(Ctrl + Shift + I)。しかし、それでも機能しません。
user590849 2012年

3
@ user590849、私の答えはを使用していませんcopyof。別の答えを参照していますか?
Yishai、2012年

50

いくつかの解決策が提供されているが、原因は何もないことがわかります。与えられた応答から機能する「何か」を取得するためだけに、何が間違っていたかを知ることが重要であると思うので、これについて詳しく説明します。

まず、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は文字列ではなくオブジェクトをインスタンス化しています...

したがって、このスレッドでは言及されていない自然な解決策ですが、オラクルが推奨するのは次のとおりです

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

それが十分に明確であることを願っています。


わずかな補正のパフォーマンスは賢明です。String tArray [] = tList.toArray(new String [tList.size()]); それ以外の場合、配列のサイズを再度変更する必要があります...
Lonzak

1
良い説明。もう1つ、メモリの消費またはパフォーマンスに問題がある場合は、配列を複製しないでください。あなたがそれを必要なときにどちらかが文字列内の要素を投げ(String)Object_Array[i]たりObject_Array[i].toString()またはString配列として配列を割り当てるObject Object_Array[]=new String[100];値を取得...その後、キャスト... String_Array=(String[])Object_Array機能するようになりました。
Solostaran14 2015年

1
これによりArrayStoreExceptionがスローされます
iltaf khalid

7

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

これにより、配列を使用する必要がなくなりますが、これが私の好ましい方法だと思います。


1
@Yishai:いいえ、配列はIterableを実装していません。それらの反復は、JLSで特別に定義されています
newacct 2009年

@newacct、かなり真実ですが、配列は簡単にIterable(Arrays.asList())でラップできることを意味しました。なぜそうなったのか分かりません。
Yishai

5

配列内のオブジェクトの文字列表現を取得したい場合は、そうです。それを行う他の方法はありません。

オブジェクト配列に文字列のみが含まれていることがわかっている場合は、次の操作も実行できます(toString()を呼び出す代わりに):

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

Object_ArrayのString []へのキャストを使用できる唯一のケースは、それが参照する配列が実際にString []として定義される場合です。たとえば、次のように機能します。

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

5

これはいいですが、角括弧のため、mmyersが気づいたように動作しません:

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

これは醜いですが動作します:

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

このコードを使用する場合は、オブジェクトのtoString()によって返される文字列にコンマが含まれていないことを確認する必要があります。


1
興味深い提案ですが、最初と最後の要素の[と]を最初に削除する必要があります。
マイケル・マイヤーズ

1
それが仕事を実行するまで豪華です:)
AZ_

2
文字列にカンマ(、)が含まれている場合、これは機能しません
Andreas Berger

2

あなたの考えでは、実際にはあなたは成功に近づいていますが、あなたがそうするならこれで大丈夫です:

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

ところで、Arraysユーティリティメソッドの使用は非常に優れており、コードをエレガントにしています。



1

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

0

何の問題もなく簡単に変更オブジェクト配列を文字列配列に変換Object drivex [] = {1,2};

    for(int i=0; i<drive.length ; i++)
        {
            Str[i]= drivex[i].toString();
            System.out.println(Str[i]); 
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.