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);
Java 8の場合:
String[] strings = Arrays.stream(objects).toArray(String[]::new);
他の型の配列を変換するには:
String[] strings = Arrays.stream(obj).map(Object::toString).
toArray(String[]::new);
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;
実際に書かれたコードがこのようなことをしているとき。 Javadocはそれを言っています!それは新しい配列をインスタンス化します。
Object tSObjectArray[] = new Object[2];
String tStringArray[] = (String[]) tSObjectArray;
だからtList.toArrayはオブジェクトではなく、文字列をインスタンス化しています...
したがって、このスレッドで言及されていない自然な解決策は、Oracleが推奨するものです。
String tArray[] = tList.toArray(new String[0]);
それが十分に明確であることを願っています。
グーグルコレクションフレームワークは、あなたがあなたのオブジェクトを文字列に変換することができるので、quoteを良い変換方法に提供します。唯一の欠点は、反復可能から反復可能にする必要があることですが、これが私のやり方です。
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();
}
});
これは配列の使用からあなたを連れ去ります、しかし、私はこれが私の好ましい方法だろうと思います。
配列内のオブジェクトのString表現を取得したい場合は、他に方法はありません。
Object配列にStringしか含まれていないことがわかっている場合は、次のようにすることもできます(toString()の呼び出しのinstread)。
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;
これはいいですが、角括弧のために気付いたミリメートルとしては機能しません。
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]);
}