অ্যারেলিস্ট <অবজেক্ট> এ প্রতিটি অবজেক্ট কী ধরণের তা আমি কীভাবে খুঁজে পাব?


87

আমার কাছে একটি ডিবি থেকে আমদানি করা বিভিন্ন উপাদানগুলির দ্বারা তৈরি একটি অ্যারেলিস্ট রয়েছে, তারে স্ট্রিং, সংখ্যা, ডাবল এবং ইনস দিয়ে তৈরি। প্রতিটি উপাদান প্রতিটি ধরণের কী ডেটা ধারণ করে তা খুঁজে পাওয়ার জন্য প্রতিবিম্বের ধরণের কৌশলটি ব্যবহার করার কোনও উপায় আছে কি?

এফওয়াইআই: প্রচুর পরিমাণে ডেটা থাকার কারণটি হ'ল এটি জাভা কোডের এক টুকরো যা বিভিন্ন ডিবি'র সাথে প্রয়োগ করার জন্য লেখা হচ্ছে।

উত্তর:


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

4
প্রকৃতপক্ষে o.GetType () == typof (int)) ব্যবহার করার পরিবর্তে যদি (o ইন্ট হয়) বলুন;
মাইকেল ব্রাউন

4
এবং যদি আপনি প্রতিটি ন্যানোসেকেন্ড সম্পর্কে উদ্বিগ্ন হয়ে পড়ে থাকেন তবে "হিসাবে" আপনাকে একটি কাস্টের সাথে "তুলনা" করার তুলনায় কিছুটা বাঁচায়।
নীল

47
আপনি কি শুধু instanceofজাভা মামলায় করতে পারবেন না ?
রেজার ঝড়

4
পূর্ণসংখ্যার ক্ষেত্রে এটিও পূর্ণসংখ্যা.ক্লাস হওয়া উচিত, আমি কেবল চেষ্টা করেছি পূর্ণসংখ্যা tried টিওয়াইপি কাজ করে না।
অ্যালান টিউরিং

(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)) {
   ...
 }
}

নোট করুন যে উদাহরণটি সাবক্লাসগুলির সাথে মিলবে। উদাহরণস্বরূপ, এর Cএকটি সাবক্লাস হয় A, তবে নিম্নলিখিতটি সত্য হবে:

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

তবে, নিম্নলিখিতটি মিথ্যা হবে:

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


13

আপনি প্রায় কখনও চাইবেন না যে আপনি এমন কিছু ব্যবহার করুন:

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

কারণ আপনি সম্ভাব্য সাবক্লাসগুলির জন্য অ্যাকাউন্টিং করছেন না। আপনি সত্যিই # ক্লাসের # এসাইনযোগ্যযোগ্য থেকে ব্যবহার করতে চান:

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

5

জাভাতে কেবল অপারেটরটি ব্যবহার করুন। এটি সাবক্লাসগুলিরও যত্ন নেবে।

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

উদাহরণস্বরূপ যদি আপনি নির্দিষ্ট ক্লাসের উপর নির্ভর না করেন তবে কাজ করে তবে আপনার মনে রাখবেন যে তালিকায় শূন্যতা থাকতে পারে, তাই আপজ.জেটক্লাস () ব্যর্থ হবে, তবে উদাহরণ সর্বদা নালায় প্রত্যাখ্যান করে।


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

আপনি বলছেন "এটি জাভা কোডের একটি টুকরো লেখা হচ্ছে", যা থেকে আমি অনুমান করি যে এখনও একটি সুযোগ রয়েছে যে আপনি এটি অন্যরকমভাবে ডিজাইন করতে পারবেন।

একটি অ্যারেলিস্ট থাকা জিনিস সংগ্রহের মতো। আপনি যখনই কোনও তালিকা থেকে কোনও জিনিস নেওয়ার জন্য উদাহরণস্বরূপ বা getClass জোর করার পরিবর্তে সিস্টেমটি ডিজাইন করবেন না কেন আপনি ডিবি থেকে পুনরুদ্ধার করার সময় আপনি যে ধরণের জিনিসটি পেতে পারেন এবং এটি যথাযথ ধরণের সংকলনে সংরক্ষণ করুন আপত্তি?

অথবা, আপনি এটি করতে এমন অনেকগুলি ডেটা অ্যাক্সেস লাইব্রেরি ব্যবহার করতে পারেন।


0

যদি আপনি কোনও আকারে ডেটা সংখ্যাসূচক হওয়ার প্রত্যাশা করেন এবং আপনি যা করতে আগ্রহী তা হ'ল ফলাফলকে একটি সংখ্যাসূচক মানতে রূপান্তর করা, আমি পরামর্শ দেব:

for (Object o:list) {
  Double.parseDouble(o.toString);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.