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

.
War es hilfreich?

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top