প্রতিবিম্বটি ব্যবহার না করে কোনও বস্তু একটি অ্যারে হয় তা কীভাবে দেখবেন?


99

প্রতিচ্ছবি ব্যবহার না করে যদি কোনও অবজেক্ট অ্যারে হয় তবে আমি জাভাতে কীভাবে দেখতে পাব? এবং আমি প্রতিবিম্বটি ব্যবহার না করে কীভাবে সমস্ত আইটেমের মাধ্যমে পুনরাবৃত্তি করতে পারি?

আমি গুগল জিডব্লিউটি ব্যবহার করি যাতে আমার প্রতিবিম্ব ব্যবহার করার অনুমতি নেই :(

আমি উল্লেখগুলি ব্যবহার না করে নিম্নলিখিত পদ্ধতিগুলি প্রয়োগ করতে পছন্দ করব:

private boolean isArray(final Object obj) {
  //??..
}

private String toString(final Object arrayObject) {
  //??..
}

বিটিডাব্লু: আমি জাভাস্ক্রিপ্টটি এমনভাবে ব্যবহার করতে চাই না যে আমি এটি জি-জিডব্লিউটি পরিবেশে ব্যবহার করতে পারি।

উত্তর:


251

তুমি ব্যবহার করতে পার Class.isArray()

public static boolean isArray(Object obj)
{
    return obj!=null && obj.getClass().isArray();
}

এটি উভয় বস্তু এবং আদিম ধরণের অ্যারেগুলির জন্য কাজ করে।

ToString জন্য একবার দেখুন Arrays.toString। আপনাকে অ্যারের প্রকারটি পরীক্ষা করতে হবে এবং উপযুক্ত toStringপদ্ধতিটি কল করতে হবে ।


4
আপনি যে অ্যারে ব্যবহার করে তা খুঁজে বের করতে পারেন তা যুক্তিযুক্ত obj.getClass().getComponentType()
স্টিভ চেম্বারস

68

আপনি ব্যবহার করতে পারেন instanceof

জেএলএস 15.20.2 প্রকারের তুলনা অপারেটর instanceof

 RelationalExpression:
    RelationalExpression instanceof ReferenceType

চলাকালীন সময়ে instanceofঅপারেটরের ফলাফল trueযদি রিলেশনালএক্সপ্রেসের মান না হয় nullএবং রেফারেন্সটি টাইপ না করে রেফারেন্স টাইপ করা যায় ClassCastException। অন্যথায় ফলাফল হয় false

এর অর্থ আপনি এরকম কিছু করতে পারেন:

Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"        

যদি বস্তু একটি কিনা চেক আছে চাই instanceof boolean[], byte[], short[], char[], int[], long[], float[], double[], অথবা Object[], আপনি সমস্ত অ্যারের ধরনের সনাক্ত করতে চান।

এছাড়াও, একটি int[][]হ'ল একটি instanceof Object[], সুতরাং আপনি কীভাবে নেস্টেড অ্যারেগুলি পরিচালনা করতে চান তার উপর নির্ভর করে এটি জটিল হয়ে উঠতে পারে।

এর জন্য toString, আপনার ব্যবহার করতে পারেন java.util.Arraysএমন একটি toString(int[])এবং অন্যান্য ওভারলোড রয়েছে। এটি deepToString(Object[])নেস্টেড অ্যারেগুলির জন্যও রয়েছে ।

public String toString(Object arr) {
   if (arr instanceof int[]) {
      return Arrays.toString((int[]) arr);
   } else //...
}

এটি খুব পুনরাবৃত্তিমূলক হতে চলেছে (তবে java.util.Arraysএটি খুব পুনরাবৃত্তিমূলক ) তবে জাভাতে অ্যারেতে এটি সেভাবেই।

আরো দেখুন


ধন্যবাদ, এটি এত সহজ যে বুঝতে পারিনি। চিন্তাভাবনা জোরালোভাবে টি দিয়ে সোজা ব্যবহার করা যায়নি [] :(
এডব্রাস

4
বিটিডাব্লু: আমি আবিষ্কার করার জন্য আরও একটি দুর্দান্ত উপায়ও লক্ষ্য করেছি যে কোনও জিনিস অ্যারে Class.isArray () (অ্যারেএসডিপিটোস্ট্রিং () এ ব্যবহৃত) is
এডব্রাস

@ এডাব্রাস: হ্যাঁ, স্টিভ কুও নীচে নীচে যা বলেছিলেন। আমার সমাধানটি API কলের পরিবর্তে খাঁটি ভাষাগত গঠন ব্যবহার করে।
বহুবৃক্ষের পদার্থগুলি

এটি দুর্দান্ত কাজ করে, আমি কেবল উদাহরণ ব্যবহার করি না তবে তুলনা হিসাবে গেটক্লাস ব্যবহার করি as এর মতো কিছু: যদি (অ্যারে.জেটক্লাস == ইনট [] ক্লাস) {অ্যারে.টো স্ট্রিং ((ইনট []) অ্যারে);
All

@ এডাব্রাস: java.util.Arraysহ্যাঁ, এটি কীভাবে হয়। আমি দেখতে পাচ্ছি যে আপনি আমার সাথে লিঙ্কযুক্ত কোডটি পড়ছেন reading
বহুবৃক্ষীয় পদার্থগুলি

36

নিম্নলিখিত কোডগুলি ব্যবহার করে একটি অ্যারের প্রতিটি উপাদান পৃথকভাবে অ্যাক্সেস করতে পারে:

Object o=...;
if ( o.getClass().isArray() ) {
    for(int i=0; i<Array.getLength(o); i++){
        System.out.println(Array.get(o, i));
    }
}

লক্ষ্য করুন যে এটি কোন ধরণের অন্তর্নিহিত অ্যারে তা জানা অপ্রয়োজনীয়, কারণ এটি কোনও অ্যারের জন্য কাজ করবে।


4
isArray()এই উত্তরটির 4 বছর পূর্বে পোস্ট করা উত্তরগুলিতে ইতিমধ্যে যথেষ্ট পরিমাণে কভার ছিল।
জেসন সি

15
এই উত্তরটি দুর্দান্ত কারণ এটি আমাদের দেখায় যে কীভাবে অ্যারের আকার পাওয়া যায় এবং এর সামগ্রীর প্রকারের অজান্তে কোনও উপাদান পুনরুদ্ধার করা যায়। আমি নিশ্চিত যে বেশিরভাগ মানুষ এর আগে কোডটি আগে কখনও লেখেনি।
ক্রিস্টোফার ইয়াং

@ মার্টেনবোডওয়েস - জিডব্লিউটি-র "প্রতিবিম্ব ব্যবহার না করা" মানে কী তা সিদ্ধান্ত নিতে আমি এই লিঙ্কটি ব্যবহার করব।
স্টিফেন সি

10

আদিম ধরণের অ্যারেগুলির মধ্যে বা কোনও আদিম ধরণের অ্যারের এবং একটি রেফারেন্স টাইপের অ্যারের মধ্যে কোনও সাব-টাইপিং সম্পর্ক নেই। জেএলএস 4.10.3 দেখুন ।

অতএব, পরীক্ষার হিসাবে নিম্নলিখিতটি কোনও ধরণেরobj অ্যারে কিনা তা দেখতে ভুল :

// INCORRECT!
public boolean isArray(final Object obj) {
    return obj instanceof Object[];
}

বিশেষত, objআদিমদের 1-D অ্যারে থাকলে এটি কাজ করে না । (যদিও এটি উচ্চ মাত্রার সাথে আদিম অ্যারেগুলির জন্য কাজ করে, কারণ সমস্ত অ্যারের ধরণের উপপ্রকার হয় ObjectBut তবে এটি এক্ষেত্রে কার্যকর is

আমি গুগল জিডব্লিউটি ব্যবহার করি যাতে আমার প্রতিবিম্ব ব্যবহার করার অনুমতি নেই :(

সর্বোত্তম সমাধান ( isArrayপ্রশ্নের অ্যারে অংশে) "প্রতিবিম্ব ব্যবহার করে" কী হিসাবে গণ্য হয় তার উপর নির্ভর করে।

  • জিডাব্লুটিটিতে, কলিং obj.getClass().isArray()প্রতিবিম্ব 1 ব্যবহার করে গণনা করে না , তাই এটিই সেরা সমাধান।

  • অন্যথায়, কোনও বস্তুর অ্যারে টাইপ রয়েছে কিনা তা নির্ধারণের সর্বোত্তম উপায় হ'ল instanceofঅভিব্যক্তির ক্রম ব্যবহার করা ।

    public boolean isArray(final Object obj) {
        return obj instanceof Object[] || obj instanceof boolean[] ||
           obj instanceof byte[] || obj instanceof short[] ||
           obj instanceof char[] || obj instanceof int[] ||
           obj instanceof long[] || obj instanceof float[] ||
           obj instanceof double[];
    }
    
  • আপনি নিম্নরূপে অবজেক্টের শ্রেণীর নামটি নিয়ে গোলমাল করার চেষ্টা করতে পারেন তবে কলটি obj.getClass()প্রতিবিম্বের সাথে সীমাবদ্ধ।

    public boolean isArray(final Object obj) {
        return obj.getClass().toString().charAt(0) == '[';
    }
    

1 - আরো সঠিকভাবে, Class.isArrayপদ্ধতি হিসাবে GWT দ্বারা সমর্থিত তালিকাভুক্ত করা হয় এই পৃষ্ঠার


0

ক্লাসটি কোনও সংগ্রহ , মানচিত্র বা অ্যারে উপস্থাপন করে কিনা তা পরীক্ষা করতে আপনি একটি ইউটিলিটি ক্লাস তৈরি করতে পারেন

  public static boolean isCollection(Class<?> rawPropertyType) {
        return Collection.class.isAssignableFrom(rawPropertyType) || 
               Map.class.isAssignableFrom(rawPropertyType) || 
               rawPropertyType.isArray();
 }

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.