2012-01-18 25 views
7

मैं एक ऐसी विधि लिख रहा हूं जो हर ऑब्जेक्ट को पारित करता है। यह ऑब्जेक्ट के लिए Object.toString() विधि को कॉल करके ठीक काम करता है लेकिन सरणी के लिए काम नहीं करता है। मैं यह पता लगा सकता हूं कि यह Object.getClass().isArray() विधि के साथ एक ऐरे है, लेकिन मुझे नहीं पता कि इसे कैसे डाला जाए।जावा में प्रिंट एरे

int[] a; 
Integer[] b; 

Object aObject = a; 
Object bObject = b; 

// this wouldn't work 
System.out.println(Arrays.toString(aObject)); 
System.out.println(Arrays.toString(bObject)); 

उत्तर

12

यदि आप इस प्रकार को नहीं जानते हैं तो आप ऑब्जेक्ट को Object[] पर डाल सकते हैं और इसे इस तरह प्रिंट कर सकते हैं (यह सुनिश्चित करने के बाद कि यह वास्तव में एक सरणी है और इसे Object[] पर डाला जा सकता है)।

private void printAnyArray(Object aObject) { 
    if (aObject.getClass().isArray()) { 
     if (aObject instanceof Object[]) // can we cast to Object[] 
      System.out.println(Arrays.toString((Object[]) aObject)); 
     else { // we can't cast to Object[] - case of primitive arrays 
      int length = Array.getLength(aObject); 
      Object[] objArr = new Object[length]; 
      for (int i=0; i<length; i++) 
       objArr[i] = Array.get(aObject, i); 
      System.out.println(Arrays.toString(objArr)); 
     } 
    } 
} 

परीक्षण:

printAnyArray(new int[]{1, 4, 9, 16, 25}); 
printAnyArray(new String[]{"foo", "bar", "baz"}); 

उत्पादन:

[1, 4, 9, 16, 25] 
[foo, bar, baz] 
+0

मैं कैसे पता लगा सकता हूं कि यह एक आदिम सरणी है या नहीं? इसके अलावा मुझे सरणी के आदिम प्रकार को जानने की जरूरत है। – multiholle

+0

@multiholle - मेरा संपादन देखें। –

+0

Pls अद्यतन कोड की जांच करें, यह ** अब किसी भी सरणी ऑब्जेक्ट को मुद्रित करेगा ** आपको प्रत्येक आदिम प्रकार को 'if/elseif/else' – anubhava

1

आप कैसे आप किसी भी सरणी पर प्रोग्राम के रूप में इस विधि कॉल कर सकते हैं पूछ रहे हैं, यह आदिम सरणियों के साथ संभव हो सकता है के लिए नहीं जा रहा है। Arrays कक्षा के लिए दस्तावेज़ों को देखते हुए, आप देखेंगे कि प्रत्येक आदिम सरणी प्रकार के लिए toString() का अधिभार है।

ऐसा इसलिए है क्योंकि int[] उदाहरण के लिए Object[] से अधिक है।

संपादित करें: यहाँ एक खेद longwinded आदिम सरणियों शामिल करने के लिए समाधान है:

public static void printObject(Object obj) { 

    String output; 

    if (obj == null) { 
     output = "null"; 
    } 
    else if (obj.getClass().isArray()) { 

     if (obj instanceof Object[]) { 
      output = Arrays.toString((Object[])obj); //Object[] overload 
     } 
     else if (obj instanceof int[]) { 
      output = Arrays.toString((int[])obj); //int[] overload 
     } 
     //and so on for every primitive type 
    } 
    else { 
     output = obj.toString(); 
    } 

    System.out.println(output); 
} 

मैं आशा करती हूं किसी और एक और अधिक सुरुचिपूर्ण समाधान प्रदान कर सकते हैं, लेकिन आदिम सरणियों के सीमाओं के आधार पर, हो सकता है यह सबसे अच्छा आप कर सकते हैं।

-2
यदि यह Object[] का एक उदाहरण नहीं है तो एक Object[] पहले और उसके बाद प्रिंट बनाने के लिए प्रतिबिंब का उपयोग

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

+0

लेकिन अगर इसे आदिम प्रकार होते हैं तो मैं इसे 'ऑब्जेक्ट' सरणी में नहीं डाल सकता। – multiholle

1

क्यों आप method overloading अपनी समस्या का समाधान नहीं करते हैं? सीधे शब्दों में दो (या अधिक) ही नाम के साथ तरीकों लेकिन अलग हस्ताक्षर लिखने और फिर संकलक तय जो विधि जब कार्यक्रम कार्यान्वित बुलाया जाएगा करते हैं:

void print(Object object) { 
    System.out.println("Object: " + object); 
} 

void print(Object[] array) { 
    System.out.println("Object[]: " Arrays.toString(array)); 
} 

void print(int[] array) { 
    System.out.println("int[]: " Arrays.toString(array)); 
} 

उदाहरण उपयोग कहीं और कोड में:

String first = "test"; 
print(first); // prints "Object: test"; 

String[] second = {"A", "B"};  
print(second); // prints "Object[]: [A, B]" 

int[] third = {1, 2}; 
print(third); // prints "int[]: [1, 2]" 
0

यदि आप ऑब्जेक्ट की क्लास पर ऑब्जेक्ट टूस्टिंग विधि को अधिभारित करने के लिए ऑब्जेक्ट की कक्षा पर भरोसा नहीं करना चाहते हैं तो आपको ऑब्जेक्ट की गहरी संरचना प्राप्त करने के लिए प्रतिबिंब का उपयोग करने की आवश्यकता है (प्रिंटिंग क्लास नाम और हैश कोड से कुछ और उपयोगी प्राप्त करने के लिए ...)

मेरा सुझाव http://code.google.com/p/google-gson/

public static String print(Object object) { 
    return new Gson().toJson(object); 
} 

public static void test() { 
    System.out.println(print(new int[][] {new int[] {1, 2, 3} })); 
    // outputs: [[1,2,3]] 
    System.out.println(print(new String[] { "aa", "bb", "cc" })); 
    // outputs: ["aa","bb","cc"] 
} 

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

लेकिन असली लाभ यह है कि यह किसी भी वर्ग की वस्तुओं को एक समान तरीके से प्रिंट करता है, चाहे कक्षा किसी भी उपयोगी तरीके से स्ट्रिंग को ओवरराइड कर दे या नहीं।

संबंधित मुद्दे