मुझे कैसे पता चलेगा कि प्रत्येक वस्तु एक ArrayList <Object> में किस प्रकार की है?


87

मेरे पास एक ArrayList है जो एक db से आयातित विभिन्न तत्वों से बना है, जो स्ट्रिंग्स, संख्याओं, डबल्स और इन्ट्स से बना है। क्या प्रत्येक तत्व के प्रत्येक प्रकार के डेटा को खोजने के लिए एक प्रतिबिंब प्रकार तकनीक का उपयोग करने का एक तरीका है?

FYI करें: कई प्रकार के डेटा होने का कारण यह है कि यह जावा कोड का एक टुकड़ा है जिसे विभिन्न DB के साथ लागू किया जाना लिखा जा रहा है।

जवाबों:


100

सी # में: माइक
से सिफारिश के साथ फिक्स्ड

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

3
वास्तव में o.GetType () == टाइपोफ़ (int) का उपयोग करने के बजाय केवल यह कहें कि (o int);
माइकल ब्राउन

और अगर आप हर नैनोसेकंड के बारे में चिंतित होने लगते हैं, तो "एक कलाकार के साथ" "कुछ" की तुलना में आपको बचाएगा।
नील

47
तुम सिर्फ instanceofजावा मामले में नहीं कर सकते ?
रेजर स्टॉर्म

2
इंटेगर मामले के लिए, यह भी होना चाहिए Integer.class, मैंने सिर्फ Integer की कोशिश की। यह काम नहीं करता है।
एलन ट्यूरिंग

(int) oजावा में काम नहीं करता है। यह त्रुटि संदेश पैदा करता है Cannot cast from Object to int(Integer o).intValue()इसके बजाय उपयोग करें ।
मैक्स

54

आप getClass()विधि का उपयोग कर सकते हैं , या आप इंस्टोफ़ का उपयोग कर सकते हैं। उदाहरण के लिए

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

या

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

ध्यान दें कि Instof उपवर्गों से मेल खाएगा। उदाहरण के लिए, का Cउपवर्ग है A, तो निम्नलिखित सत्य होंगे:

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

हालांकि, निम्नलिखित गलत होगा:

C c = new C();
assert !c.getClass().equals(A.class)

45
for (Object object : list) {
    System.out.println(object.getClass().getName());
}

7
यदि यह आपकी सूची में संभव है तो अशक्त के बारे में मत भूलना। आपको नल के साथ इस उदाहरण से NullPointerException मिल जाएगी।
जॉन गार्डनर

13

आप लगभग कभी नहीं चाहते हैं कि आप कुछ का उपयोग करें:

Object o = ...
if (o.getClass().equals(Foo.class)) {
    ...
}

क्योंकि आप संभावित उपवर्गों का हिसाब नहीं दे रहे हैं। आप वास्तव में कक्षा # isAssignableFrom का उपयोग करना चाहते हैं:

Object o = ...
if (Foo.class.isAssignableFrom(o)) {
    ...
}

5

जावा में बस Instof ऑपरेटर का उपयोग करें। इसमें उपवर्गों का भी ध्यान रखा जाएगा।

ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
   if(obj instanceof String){
   }else if(obj instanceof Integer){
   }etc...
}

5
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());
            }
        }
    }
}

4

बस एक लूप में .getClass()प्रत्येक पर कॉल करें Object

दुर्भाग्य से, जावा नहीं है map()। :)


3

Instanceof काम करता है यदि आप विशिष्ट वर्गों पर निर्भर नहीं करते हैं, लेकिन यह भी ध्यान रखें कि आप सूची में नल हो सकते हैं, इसलिए obj.getClass () विफल हो जाएगा, लेकिन Instof हमेशा शून्य पर झूठे लौटता है।


3

जावा 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
            }
        });


2

उपयोग करने के बजाय 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

0

आप कहते हैं "यह जावा कोड का एक टुकड़ा लिखा जा रहा है", जिसमें से मैं अनुमान लगाता हूं कि अभी भी एक मौका है कि आप इसे एक अलग तरीके से डिजाइन कर सकते हैं।

एक ArrayList होने सामान के संग्रह की तरह है। हर बार जब आप सूची से एक ऑब्जेक्ट लेते हैं, तो उदाहरण के लिए, उदाहरण के लिए, जब आप डीबी से इसे प्राप्त करते हैं, तो ऑब्जेक्ट को उस प्रकार का प्राप्त करते हैं, और इसे उपयुक्त प्रकार के संग्रह में संग्रहीत करते हैं। वस्तु?

या, आप कई डेटा एक्सेस पुस्तकालयों में से एक का उपयोग कर सकते हैं जो आपके लिए ऐसा करने के लिए मौजूद हैं।


0

यदि आप किसी रूप में डेटा के संख्यात्मक होने की उम्मीद करते हैं, और आप सभी जो करने में रुचि रखते हैं, वह परिणाम को संख्यात्मक मान में परिवर्तित कर रहा है, तो मैं सुझाव दूंगा:

for (Object o:list) {
  Double.parseDouble(o.toString);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.