ArrayList<Object> 内の各オブジェクトの型を確認するにはどうすればよいですか?
-
01-07-2019 - |
質問
データベースからインポートされたさまざまな要素で構成される ArrayList があり、文字列、数値、double、int で構成されています。リフレクションタイプの手法を使用して、各要素が保持する各タイプのデータを調べる方法はありますか?
ご参考までに:データの種類が非常に多い理由は、これがさまざまな DB で実装されるように記述された Java コードであるためです。
解決
C# の場合:
からの推奨により修正されました マイク
ArrayList list = ...;
// List<object> list = ...;
foreach (object o in list) {
if (o is int) {
HandleInt((int)o);
}
else if (o is string) {
HandleString((string)o);
}
...
}
Javaの場合:
ArrayList<Object> list = ...;
for (Object o : list) {
if (o instanceof Integer)) {
handleInt((Integer o).intValue());
}
else if (o instanceof String)) {
handleString((String)o);
}
...
}
他のヒント
使用できます getClass()
メソッドを使用することも、instanceof を使用することもできます。例えば
for (Object obj : list) {
if (obj instanceof String) {
...
}
}
または
for (Object obj : list) {
if (obj.getClass().equals(String.class)) {
...
}
}
instanceof はサブクラスと一致することに注意してください。たとえば、 C
のサブクラスです A
, の場合、次のことが当てはまります。
C c = new C();
assert c instanceof A;
ただし、次の場合は false になります。
C c = new C();
assert !c.getClass().equals(A.class)
for (Object object : list) {
System.out.println(object.getClass().getName());
}
次のようなものを使用することはほとんどありません。
Object o = ...
if (o.getClass().equals(Foo.class)) {
...
}
サブクラスの可能性を考慮していないからです。本当に Class#isAssignableFrom を使用したいのです。
Object o = ...
if (Foo.class.isAssignableFrom(o)) {
...
}
Java では、instanceof 演算子を使用するだけです。これによりサブクラスも処理されます。
ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
if(obj instanceof String){
}else if(obj instanceof Integer){
}etc...
}
import java.util.ArrayList;
/**
* @author potter
*
*/
public class storeAny {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Object> anyTy=new ArrayList<Object>();
anyTy.add(new Integer(1));
anyTy.add(new String("Jesus"));
anyTy.add(new Double(12.88));
anyTy.add(new Double(12.89));
anyTy.add(new Double(12.84));
anyTy.add(new Double(12.82));
for (Object o : anyTy) {
if(o instanceof String){
System.out.println(o.toString());
} else if(o instanceof Integer) {
System.out.println(o.toString());
} else if(o instanceof Double) {
System.out.println(o.toString());
}
}
}
}
ただ電話してください .getClass()
それぞれの Object
ループの中で。
残念ながら、Java にはありません map()
. :)
Instanceof は特定のクラスに依存しない場合に機能しますが、リストに null を含めることができるため、obj.getClass() は失敗しますが、instanceof は null に対して常に false を返します。
Java8以降
mixedArrayList.forEach((o) -> {
String type = o.getClass().getSimpleName();
switch (type) {
case "String":
// treat as a String
break;
case "Integer":
// treat as an int
break;
case "Double":
// treat as a double
break;
...
default:
// whatever
}
});
を使用する代わりに object.getClass().getName()
使用できます object.getClass().getSimpleName()
, パッケージ名が含まれていない単純なクラス名が返されるためです。
例えば、
Object[] intArray = { 1 };
for (Object object : intArray) {
System.out.println(object.getClass().getName());
System.out.println(object.getClass().getSimpleName());
}
与える、
java.lang.Integer
Integer
あなたは、「これは書かれている Java コードの一部である」と言っていますが、このことから、別の方法で設計できる可能性がまだあると推測します。
ArrayList を持つことは、要素のコレクションを持つことに似ています。リストからオブジェクトを取得するたびに、instanceof または getClass を強制するのではなく、DB からオブジェクトを取得するときにオブジェクトの型を取得し、それを適切な型のコレクションに格納するようにシステムを設計してはいかがでしょうか。物体?
または、これを行うために存在する多くのデータ アクセス ライブラリの 1 つを使用することもできます。
データが何らかの形式で数値であることが予想され、結果を数値に変換することだけに興味がある場合は、次のようにすることをお勧めします。
for (Object o:list) {
Double.parseDouble(o.toString);
}