कैसे एक वस्तु एक प्रतिबिंब के उपयोग के बिना सरणी है देखने के लिए?


99

यदि कोई वस्तु प्रतिबिंब का उपयोग किए बिना एक सरणी है तो मैं जावा में कैसे देख सकता हूं? और मैं प्रतिबिंब का उपयोग किए बिना सभी वस्तुओं के माध्यम से कैसे पुनरावृति कर सकता हूं?

मैं Google GWT का उपयोग करता हूं इसलिए मुझे प्रतिबिंब का उपयोग करने की अनुमति नहीं है :(

मैं रिफ्लेक्शन का उपयोग किए बिना निम्नलिखित विधियों को लागू करना पसंद करूंगा:

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

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

बीटीडब्ल्यू: न तो मैं जावास्क्रिप्ट का उपयोग नहीं करना चाहता हूं ताकि मैं इसे गैर-जीडब्ल्यूटी वातावरण में उपयोग कर सकूं।

जवाबों:


248

आप उपयोग कर सकते हैं Class.isArray()

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

यह ऑब्जेक्ट और आदिम प्रकार सरणियों दोनों के लिए काम करता है।

ForString पर एक नज़र डालें Arrays.toString। आपको सरणी प्रकार की जांच करनी होगी और उपयुक्त toStringविधि को कॉल करना होगा ।


1
जोड़ने के लायक है कि आप उपयोग करके सरणी प्रकार का पता लगा सकते हैं obj.getClass().getComponentType()
स्टीव चैम्बर्स

68

आप उपयोग कर सकते हैं instanceof

JLS 15.20.2 प्रकार तुलना ऑपरेटर instanceof

 RelationalExpression:
    RelationalExpression instanceof ReferenceType

रन समय, का परिणाम instanceofऑपरेटर है trueयदि का मान RelationalExpression नहीं है nullऔर संदर्भ के लिए डाली जा सकता है ReferenceType एक को ऊपर उठाने के बिना 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है ), लेकिन यह जावा में सरणियों के साथ है।

यह सभी देखें


धन्यवाद, यह महसूस नहीं हुआ कि यह इतना आसान है। सोचा insstanceof टी के साथ सीधे इस्तेमाल नहीं किया जा सकता है] :(
edbras

2
BTW: मैंने यह भी पता लगाने के लिए एक और अच्छा तरीका देखा कि क्या कोई सरणी Class.isArray () (Arrays.deepToString () में उपयोग की गई) है।
edbras

@edbras: हाँ, यह वही है जो स्टीव कुओ नीचे कह रहे थे। मेरा समाधान एपीआई कॉल के बजाय शुद्ध भाषाई निर्माण का उपयोग करता है।
पॉलीजेन लुब्रीकेंट

यह ठीक काम करता है, मैं केवल Instof का उपयोग नहीं करते, लेकिन तुलना के रूप में getClass। कुछ इस तरह से: if (array.getClass == int [] वर्ग) {Arrays.toString ((int []) array); } सभी का शुक्रिया ..
edbras

@edbras: यह है कि java.util.Arraysयह कैसे , हाँ। मैं देखता हूं कि आप जिस कोड से जुड़े हैं, उसे पढ़ रहे हैं।
पॉलीजेन लुब्रिकेंट्स

35

निम्नलिखित कोड का उपयोग करके एक सरणी के प्रत्येक तत्व को अलग से एक्सेस कर सकते हैं:

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

ध्यान दें कि यह जानना अनावश्यक है कि यह किस प्रकार का अंतर्निहित सरणी है, क्योंकि यह किसी भी सरणी के लिए काम करेगा।


2
isArray()पहले से ही इस एक से 4 साल पहले पोस्ट किए गए उत्तरों में पर्याप्त रूप से कवर किया गया था।
जेसन सी

15
यह उत्तर बहुत अच्छा है क्योंकि यह हमें दिखाता है कि किसी सरणी का आकार कैसे प्राप्त किया जा सकता है और एक तत्व को उसके सामग्री प्रकार के ज्ञान के बिना पुनर्प्राप्त करता है। मुझे यकीन है कि ज्यादातर लोगों ने इस तरह का कोड पहले कभी नहीं लिखा है।
क्रिस्टोफर यांग

@MaartenBodewes - मैं इस लिंक का उपयोग यह तय करने के लिए करूँगा कि "प्रतिबिंब का उपयोग नहीं करना" GWT के लिए क्या अर्थ है।
स्टीफन सी

10

आदिम प्रकार के सरणियों के बीच, या एक आदिम प्रकार के एक सरणी और एक संदर्भ प्रकार के सरणी के बीच कोई संबंध नहीं है। JLS 4.10.3 देखें ।

इसलिए, यह देखने के लिए परीक्षण के रूप में निम्नलिखित गलत है कि क्या किसी प्रकारobj का एक सरणी है :

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

विशेष रूप से, यह काम नहीं करता है अगर objआदिम की 1-डी सरणी है। (यह उच्च आयामों के साथ आदिम सरणियों के लिए काम करता है, क्योंकि सभी सरणी प्रकार के उपप्रकार हैं Object। लेकिन इस मामले में यह गलत है।)

मैं Google GWT का उपयोग करता हूं इसलिए मुझे प्रतिबिंब का उपयोग करने की अनुमति नहीं है :(

सबसे अच्छा समाधान ( isArrayप्रश्न के सरणी भाग के लिए) "प्रतिबिंब का उपयोग" के रूप में क्या मायने रखता है पर निर्भर करता है।

  • GWT में, कॉलिंग 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();
 }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.