سؤال

لدي قائمة ArrayList مكونة من عناصر مختلفة مستوردة من قاعدة بيانات، وتتكون من سلاسل وأرقام ومضاعفات وإدخالات.هل هناك طريقة لاستخدام تقنية نوع الانعكاس لمعرفة نوع البيانات التي يحملها كل عنصر؟

لعِلمِكَ:السبب وراء وجود العديد من أنواع البيانات هو أن هذا جزء من كود جافا تتم كتابته ليتم تنفيذه باستخدام قواعد بيانات مختلفة.

هل كانت مفيدة؟

المحلول

شركة#:
ثابت مع توصية من مايك

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

في جافا:

ArrayList<Object> list = ...;
for (Object o : list) {
    if (o instanceof Integer)) {
        handleInt((Integer o).intValue());
    }
    else if (o instanceof String)) {
        handleString((String)o);
    }
    ...
}

نصائح أخرى

يمكنك استخدام ال getClass() الطريقة، أو يمكنك استخدام مثيل.على سبيل المثال

for (Object obj : list) {
  if (obj instanceof String) {
   ...
  }
}

أو

for (Object obj : list) {
 if (obj.getClass().equals(String.class)) {
   ...
 }
}

لاحظ أن مثيل سوف يتطابق مع الفئات الفرعية.على سبيل المثال، من C هي فئة فرعية من A, ، فيكون ما يلي صحيحًا:

C c = new C();
assert c instanceof A;

ومع ذلك، فإن ما يلي سيكون كاذبا:

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 فقط استخدم عامل التشغيل.وهذا سوف يعتني أيضًا بالفئات الفرعية.

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 في حلقة.

لسوء الحظ، جافا لا تملك map(). :)

يعمل Instanceof إذا كنت لا تعتمد على فئات معينة، ولكن ضع في اعتبارك أيضًا أنه يمكن أن يكون لديك قيم خالية في القائمة، لذلك ستفشل obj.getClass()، ولكن دائمًا ما يُرجع المثيل false عند القيمة null.

منذ جافا 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
            }
        });

بدلا من استخدام 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

أنت تقول "هذا جزء من كود جافا يتم كتابته"، ومن هنا أستنتج أنه لا تزال هناك فرصة لتصميمه بطريقة مختلفة.

إن وجود ArrayList يشبه وجود مجموعة من الأشياء.بدلاً من فرض مثيل أو getClass في كل مرة تأخذ فيها كائنًا من القائمة، لماذا لا تصمم النظام بحيث تحصل على نوع الكائن عند استرداده من قاعدة البيانات، وتخزينه في مجموعة من النوع المناسب من هدف؟

أو يمكنك استخدام إحدى مكتبات الوصول إلى البيانات العديدة الموجودة للقيام بذلك نيابةً عنك.

إذا كنت تتوقع أن تكون البيانات رقمية بشكل ما، وكل ما يهمك هو تحويل النتيجة إلى قيمة رقمية، فإنني أقترح ما يلي:

for (Object o:list) {
  Double.parseDouble(o.toString);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top