Wie finde ich heraus, was jeder Objekttyp in einem Arraylist ist ?
-
01-07-2019 - |
Frage
Ich habe eine Arraylist aus verschiedenen Elementen aus einer db importiert, bestehend aus Strings, Zahlen, Doppel- und ints. Gibt es eine Möglichkeit, eine Reflexionstyp-Technik zu verwenden, um herauszufinden, was jede Art von Daten jedes Element hält?
Zur Info: Der Grund, dass es so viele Arten von Daten ist, dass dies ein Stück Java-Code geschrieben werden, mit unterschiedlicher DB umgesetzt wird
.Lösung
In C #:
Feste mit Empfehlung von Mike
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);
}
...
}
In Java:
ArrayList<Object> list = ...;
for (Object o : list) {
if (o instanceof Integer)) {
handleInt((Integer o).intValue());
}
else if (o instanceof String)) {
handleString((String)o);
}
...
}
Andere Tipps
Sie können die getClass()
Methode verwenden, oder Sie verwenden können instanceof. Zum Beispiel
for (Object obj : list) {
if (obj instanceof String) {
...
}
}
oder
for (Object obj : list) {
if (obj.getClass().equals(String.class)) {
...
}
}
Beachten Sie, dass Instanceof Subklassen übereinstimmen. Zum Beispiel von C
ist eine Unterklasse von A
, dann werden die folgenden Aussagen wahr sein:
C c = new C();
assert c instanceof A;
Allerdings wird die folgende falsch sein:
C c = new C();
assert !c.getClass().equals(A.class)
for (Object object : list) {
System.out.println(object.getClass().getName());
}
Sie so gut wie nie wollen Sie verwenden so etwas wie:
Object o = ...
if (o.getClass().equals(Foo.class)) {
...
}
, weil Sie Bilanzierung nicht für möglich Subklassen. Sie wollen wirklich Klasse # IsAssignableFrom verwenden:
Object o = ...
if (Foo.class.isAssignableFrom(o)) {
...
}
In Java benutzen Sie einfach den Operator instanceof. Dies wird auch von Subklassen kümmern.
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());
}
}
}
}
Rufen Sie .getClass()
auf jedem Object
in einer Schleife.
Leider Java nicht über map()
. :)
Instanceof funktioniert, wenn Sie auf bestimmte Klassen hängen nicht, sondern halten auch daran, dass Sie NULL-Werte in der Liste haben können, so obj.getClass () fehlschlagen, aber Instanceof immer false zurück auf null.
Da Java 8
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
}
});
anstelle object.getClass().getName()
verwenden Sie object.getClass().getSimpleName()
verwenden können, weil sie einen einfachen Klassennamen ohne ein Paket zurückgibt Namen enthalten.
zum Beispiel
Object[] intArray = { 1 };
for (Object object : intArray) {
System.out.println(object.getClass().getName());
System.out.println(object.getClass().getSimpleName());
}
gibt,
java.lang.Integer
Integer
Sie sagen, „das ist ein Stück von Java-Code geschrieben wird“, von dem ich daraus schließen, dass es noch eine Chance, dass Sie es eine andere Art und Weise entwerfen könnte.
ist eine Arraylist zu haben wie eine Sammlung von Sachen mit. Anstatt die instanceof oder getClass Sie aus der Liste Objekt nehmen jedes Mal zu zwingen, warum das System nicht so auszugestalten, dass Sie die Art des Objekts erhalten, wenn Sie es aus dem DB abrufen und speichern sie in einer Sammlung des entsprechenden Typs von Objekt?
Oder Sie eines der vielen Datenzugriff Bibliotheken, die dies für Sie tun existieren nutzen könnten.
Wenn Sie erwarten die Daten in irgendeiner Form numerisch sein, und alle sind Sie interessiert tut, ist das Ergebnis in einen numerischen Wert umzuwandeln, würde ich vorschlagen:
for (Object o:list) {
Double.parseDouble(o.toString);
}