2011-08-25 14 views
7

है, मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जिसके लिए मुझे सरणी का स्ट्रिंग प्रस्तुति होना आवश्यक है। समस्या में यह डुप्लिकेट कोड है, मुझे यकीन है कि मुझे किसी भी तरह से दोबारा प्रतिक्रिया दी जा सकती है, लेकिन मुझे अभी तक कोई नहीं मिला है।पता लगाएं कि किसी सरणी में पूर्णांक या डबल

private static String printDoubleArray(String title, double[] array){ 
    String result = title; 
    for (double d : array) { 
     result += d + " "; 
    } 
    return result; 
} 

private static String printIntArray(String title, int[] array){ 
    String result = title; 
    for (int d : array) { 
     result += d + " "; 
    } 
    return result; 
} 

अग्रिम धन्यवाद।

+1

मुझे लगता है कि आपको डुप्लिकेशन के साथ रहना होगा। सभी जेडीके एपीआई वही करते हैं। हालांकि आपको क्या करना चाहिए स्ट्रिंगबिल्डर का उपयोग करना है। – Thilo

+0

यदि आप डुप्लिकेट को कम करना चाहते हैं, तो आप Arrays.toString (डबल []) और Arrays.toString (int []) का उपयोग करने का प्रयास कर सकते हैं;) –

+0

जावा जेनरिक के साथ समस्या यह प्राइमेटिव का समर्थन नहीं करती है। इस कारण से मैंने कई बार लोगों को अपने 'इंटसेट', 'डबलसेट', [मुक्केबाजी ओवरहेड को रोकने के लिए] लागू किया है ... न केवल वे 'java.util' का उपयोग नहीं कर सकते हैं।संग्रह ', उन्हें आपके द्वारा प्राथमिकताओं के साथ एक ही मुद्दे के कारण कोड को डुप्लिकेट करना होगा। – amit

उत्तर

2

तरीकों Arrays.toString(...)java.util पैकेज से में से एक का उपयोग क्यों नहीं?

int[] intArray = {1, 2, 4}; 
double[] doubleArray = {1.1, 2.2, 4.4}; 
System.out.println(Arrays.toString(intArray)); 
System.out.println(Arrays.toString(doubleArray)); 
+0

एक अच्छा अपमान, लेकिन मुझे आउटपुट के प्रारूप को नियंत्रित करने की आवश्यकता होगी –

+0

एक खोज का उपयोग करें और टेक्स्ट विधि को प्रतिस्थापित करें। आप '", "' '' '' '' ''के साथ बदल सकते हैं, और फिर प्रश्न में दिए गए आउटपुट के लिए' ['और'] 'वर्ण हटा दें। –

0

आप रैपर वर्ग इंटीजर और डबल के बजाय int और double का उपयोग कर सकते हैं। अपनी बेस क्लास Number

+3

दुर्भाग्य से हम 'डबल []' को 'डबल []' (उदाहरण के लिए) नहीं डाल सकते हैं, इसलिए हमें एक नया रैपर सरणी बनाना होगा और सभी मानों को एक-एक करके कॉपी करना होगा - और इसके लिए, हम चाहते हैं प्राइमेटिव्स के प्रत्येक सरणी को अलग से संभालना और डुप्लिकेट कोड बनाना है;) (बीटीडब्ल्यू - एक ही विचार था) –

+0

डाउनवोट क्यों। जवाब तकनीकी रूप से सही है (हालांकि यह ओपी की तलाश नहीं हो सकती है)। – sleske

4

का उपयोग करके एक विधि लिखें, आप java.lang.reflect.Array का उपयोग कर सकते हैं जो किसी भी समय सरणी के तत्वों तक पहुंच की अनुमति देता है। get(arr, index) देखें, getLength(arr) आदि

+0

और उसके बाद उसका विधि हस्ताक्षर 'प्रिंटअरे (स्ट्रिंग शीर्षक, ऑब्जेक्ट intOrDoubleArray') होगा? ऐसा लगता है कि टाइप-सुरक्षा छोड़ना (और शायद प्रतिबिंब के लिए कुछ रनटाइम प्रदर्शन)। – Thilo

+0

@ थिलो: हाँ, सच है। जावा में प्राइमेटिव्स का उपयोग करने के लिए आपको यही मिलता है। प्राइमेटिव्स वास्तव में जावा में आदिम हैं, और "असली" प्रकारों जैसे पॉलिमॉर्फिज्म के कई लाभों का आनंद नहीं लेते हैं। – sleske

2

आपकी समस्या का हल यह है:

public class Test { 

    public static String numberArrayToString(Number[] arr) { 

     if (arr == null) return ""; 

     StringBuilder sb = new StringBuilder(); 

     for (Number n : arr) { 
      sb.append(n.toString()).append(" "); 
     } 

     return sb.toString(); 

    } 

    public static void main(String[] args) { 

     Integer[] intArr = { 1, 4, 6, 7 }; 
     Double[] dblArr = { 33.44, 55.66, 11.22 }; 

     System.out.println(numberArrayToString(intArr)); 
     System.out.println(numberArrayToString(dblArr)); 

    } 

} 

यह इस का उत्पादन:

1 4 6 7 
33.44 55.66 11.22 

हालांकि, यह तभी काम करता है आप बॉक्स्ड पुरातन के साथ अपने सरणियों (परिभाषित यानी, Number के उप-वर्ग), लेकिन प्राइमेटिव के साथ नहीं (यानी, int[] और double[])।

समस्या यह है कि बॉक्स किए गए प्राइमेटिव का उपयोग वास्तव में अक्षम है।

+1

आप मौजूदा 'int []' और 'double []' से 'इंटीजर []' या 'डबल [] 'को कैसे परिवर्तित करते हैं? [संकेत: कोड डुप्लिकेशन] – amit

+1

यह पूरी समस्या है, आपको इंटीजर [] के माध्यम से एक नया int [] और लूप बनाना होगा, जो पूरी तरह से अक्षम है। वास्तविकता है: आपको अपनी विधि के कई संस्करणों को लागू करना चाहिए। – JVerstry

+0

Arrays.toString() आपकी मदद कर सकता है, लेकिन यह एक ही प्रारूप नहीं है ... – JVerstry

1

अमरूद का उपयोग करके आप Ints का उपयोग करके रैपर प्रकार (सूची) की सूची में आदिम सरणी (int []) को परिवर्तित कर सकते हैं। इसके अतिरिक्त आप Joiner का उपयोग कर सकते हैं।

Joiner.on(' ').join(Ints.asList(new int[]{1,2,3})); 

विधि तो है:

void printIntArray(String title, int[] array) { 
    printArray(title, Ints.asList(array)); 
} 

String printArray(String title, Iterable<? extends Number> asList){ 
    return title + " " + Joiner.on(' ').join(asList); 
} 
2

मैं Would उपयोग commons-lang को create the string create the print method का उपयोग कर एक Object[] array रूप such

int[] intArray = ...; 
String str = printArray(title, ArrayUtils.toObject(intArray)); 

double[] doubleArray = ...; 
String str = printArray(title, ArrayUtils.toObject(doubleArray)); 

public static void printArray(String title, Object[] array) { 
    return title + " " + StringUtils.join(array, " "); 
} 

Note, इस internally will copy एक array which will box the ints into Integer objects, इसलिए यदि सरणी का प्रदर्शन/आकार एक मुद्दा है तो मैं बुलेट काट दूंगा और आदिम प्रकारों के लिए विधियों का निर्माण करूंगा, हालांकि मैं सभी विधियों को printArray पर कॉल करूंगा और इसे विभिन्न प्रकारों से अधिभारित करूंगा।

संपादित करें:

कॉमन्स-लैंग, आप Guava पुरातन है, जो सरणी कॉपी नहीं करेंगे (लेकिन सिर्फ सूची में तैरता autobox जाएगा) इस्तेमाल कर सकते हैं के बजाय

है, तो आप कर सकता है:

int[] intArray = ...; 
String str = printArray(title, Ints.asList(intArray)); 

double[] doubleArray = ...; 
String str = printArray(title, Floats.asList(doubleArray)); 
संबंधित मुद्दे