2011-06-13 19 views
14

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

String[] array1 = new String[10]; 
int[] array2= new int[10]; 

तो एक विधि मैं दो सरणियों, अर्थात् array1 & array2
और अब मैं वापस करना चाहते अभिकलन किया है अंदर इन दोनों arrays। मुझे इसे किस प्रकार करना चाहिए?

मैं यहाँ पढ़ा है कि मैं किसी अन्य वर्ग बनाने के लिए और निश्चित वस्तु प्रकार को परिभाषित करने और उस वर्ग निर्माता में इन सरणियों संपुटित कर सकते हैं, लेकिन मैं अभी भी उलझन में हूँ और पूरी तरह से समझ में नहीं आया।

तुम मुझे एक काम उदाहरण है कि करता है, या किसी भी इसी तरह विचार हो सकता दिखा सकता है, तो यह अच्छा होगा।

+2

आप यहां एक अलग डेटा संरचना की तलाश कर रहे हैं। दो सरणी में मूल्यों के बीच संबंध क्या है? क्या मूल्य एक दूसरे के मानों से मेल खाते हैं? क्या कोई एक प्रकार का "कैश" या पुन: प्रयोज्य "कार्यक्षेत्र" है? आम तौर पर, एक विधि को वास्तव में केवल एक _thing_ लौटने की आवश्यकता होती है, इसलिए यह देखने में उपयोगी होता है कि एक विधि दो चीजों को एक बार में वापस करने का प्रयास क्यों कर रही है। – Wesley

+0

वास्तव में एक प्रकार का दो आयामी सरणी है जबकि इसकी [i] अनुक्रमणिका में स्ट्रिंग उपयोगकर्ता नाम होंगे जो स्ट्रिंग [] सरणी में होंगे। इस 1 डी स्ट्रिंग सरणी की अनुक्रमणिका 2 डी int सरणी के इंडेक्स की तरह ही होगी। तो बाद में मैं इस 1 डी ऐरे से स्ट्रिंग उपयोगकर्ता नाम को आवश्यकता के रूप में देख सकता हूं। – Johnydep

उत्तर

34

आप वास्तव में यह भी तरह कुछ लौट सकते हैं:

return new Object[]{array1, array2}; 

और के बाहर जहां आप इस विधि अपने लौटे वस्तु obj है फोन मान लीजिए। तब obj[0] और पहुँच array2 रूप array1 के रूप में obj[1] (उचित कास्टिंग की आवश्यकता होगी) पहुँच जाते हैं।

+1

धन्यवाद, यह भी बेहतर विकल्प लगता है – Johnydep

+0

बस एक सवाल है, तो मेरी विधि का रिटर्न प्रकार क्या होना चाहिए? – Johnydep

+0

+1 अच्छा विचार! सरलता जीतता है। –

1

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

class MyPair{ 
public String[] StringArr; 
public int[] IntArr; 
} 

class MyClass{ 
    public MyPair Foo(){ 
    MyPair pair = new MyPair(); 
    pair.StringArr = new String[10]; 
    pair.IntArr = new int[10]; 

    return pair; 
    } 
} 
1

इस बारे में क्या?

public object[] ReturnArray() 
{ 
    String[] array1 = new String[10]; 
    int[] array2= new int[10]; 
    object[] arrayObjects = new object[2]; 
    arrayObjects [0] = array1; 
    arrayObjects [1] = array2; 
    return arrayObjects; 
} 

आप उन्हें बाद में इस तरह उपयोग कर सकते हैं:

object[] arrayObjects = ReturnArray(); 
String[] array1 = (String[])arrayObjects[0]; 
int[] array2= (int[])arrayObjects[1] 
+1

धन्यवाद @ एमआर, आपका विचार @anubhava जैसा ही है और मैं इसे पहले से ही उपयोग कर रहा हूं। – Johnydep

1

तो इन दोनों से संबंधित हैं, शायद आप एक java.util.Map लौटने से बेहतर कुंजी के रूप में एक और मूल्य के रूप में अन्य, या के साथ होगा, एक java.util.List जिसमें आपकी अपनी रचना की वस्तुएं शामिल हैं जो String और int को एक साथ जोड़ती है।

+0

धन्यवाद, मानचित्र का उपयोग करके एक अच्छा विचार लगता है लेकिन चूंकि मैं महत्वपूर्ण मूल्य मुसीबत में नहीं आना चाहता हूं इसलिए मैं नौकरी करने के अधिक मूर्ख तरीके से रहूंगा। – Johnydep

+0

"मुख्य मूल्य समस्या" क्या है? अधिक बेवकूफ लगभग उतना अच्छा नहीं हो सकता है। बेहतर कच्चा मूल्य जो आप उन कच्चे मूल्यों के शीर्ष पर डाल सकते हैं, आप से बेहतर और इस विधि के ग्राहक होंगे। – duffymo

+0

मुसीबत से ठीक है मेरा मतलब है कि इसे और अधिक सीखना है। मुझे सहज महसूस नहीं होता है लेकिन हाँ आप सही हैं। – Johnydep

1

अपाचे commonslang में संस्करण 3 में Pair है (जो फिलहाल बीटा में है)।

मैं हमेशा अपने आप को रोल करने पर भरोसेमंद पुस्तकालयों का उपयोग करने का समर्थन करता हूं (भले ही यह केवल एक टुपल हो)।

एक पूछने के लिए कारण है कि आप दो मानों लौट रहे है, कि वे किस तरह से संबंधित हैं। आम तौर पर इस स्थिति में मूल्य संबंधित होते हैं और किसी ऑब्जेक्ट में encapsulated किया जाना चाहिए।

5

इस प्रकार आप जोड़ी वर्ग को परिभाषित कर सकते हैं:

public class Pair 
{ 
    private String[] array1; 
    private int[] array2; 
    public Pair(String[] array1, int[] array2) 
    { 
     this.array1 = array1; 
     this.array2 = array2; 

    } 
    public String[] getArray1() { return array1; } 
    public int[] getArray2() { return array2; } 
} 

तो आप इसे अपने विधि में उपयोग कर सकते हैं:

public Pair someMethod() 
{ 
    String[] array1 = new String[10]; 
    int[] array2 = new int[10]; 

    // blah blah blah 

    return new Pair(array1, array2); 
} 

और इस प्रकार आप अपनी विधि का उपयोग कर सकते हैं:

Pair pair = someMethod(); 
String[] arrayA = pair.getArray1(); 
int[] arrayB = pair.getArray2(); 
+1

धन्यवाद, यह मेरा मूल विचार था। आपने एक बहुत स्पष्ट समझ दी कि इसे कैसे किया जाए। – Johnydep

+0

@ जॉनीडेप आपका स्वागत है :) –

7

किसी ऑब्जेक्ट को परिभाषित करें जो आपके द्वारा वापस आने का प्रयास करने के लिए समझ में आता है।

public class Inventory {  
     private int[] itemNumbers; //array2 
     private String[] itemNames; //array1 

     public Inventory(int[] itemNumbers, String[] itemNames) 
     { 
     this.itemNumbers = itemNumbers; 
     this.itemNames = itemNames; 
     } 

     //Setters + getters. Etc. 
} 

फिर कहीं और: एक उदाहरण के रूप

return new Inventory(array2, array1); 

============================ ===================

नोट्स:

ऊपर के उदाहरण एक सूची का एक अच्छा उदाहरण नहीं है। एक आइटम वर्ग बनाएं जो किसी आइटम (आइटम आईडी, आइटम का नाम इत्यादि) का वर्णन करे और उनमें से एक सरणी संग्रहित करें।

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

यदि int/स्ट्रिंग सरणी कुंजी/मान जोड़े का प्रतिनिधित्व करती हैं, तो उपयोग एक मानचित्र डीएसटी कार्यान्वयन (http://download.oracle.com/javase/6/docs/api/java/util/Map.html का उपयोग कर सकते हैं) इसके बजाए और उसे वापस कर दें। आप आवश्यकतानुसार कुंजी/मानों पर फिर से सक्रिय कर सकते हैं।

0

आपकी टिप्पणी के आधार पर, आप इस दृष्टिकोण से कई तरीके हैं।

  1. एक वर्ग एक उपयोगकर्ता

    आपने कहा है कि आप पूर्णांकों का एक 2 डी सरणी है, जहां प्रत्येक पंक्ति एक एकल उपयोगकर्ता का वर्णन के साथ काम कर रहे हैं का प्रतिनिधित्व बनाएँ। शायद प्रत्येक उपयोगकर्ता का वर्णन करने वाला ऑब्जेक्ट होना उचित होगा।

    class User { 
        String name; 
        int[] values; 
    
        // setters and getters for name, values 
    } 
    
    User[] doSomething() { 
        User[] users = new User[10]; 
    
        // fill the array 
    
        return users; 
    } 
    
  2. एक वर्ग पूरे वापसी मान

    यह अच्छा है अगर तुम सच में 2 डी सरणी के अतिरिक्त प्रदर्शन की आवश्यकता है का प्रतिनिधित्व बनाएँ।

    class UserData { 
        String[] names; 
        int[][] values; 
    
        // setters and getters for names, values 
    } 
    
    UserData doSomething() { 
        UserData userData = new UserData(); 
    
        // set names and values 
    
        return userData; 
    } 
    
0

उपयोग new Object[]{array1, array2} to retun

retun new Object[]{array1,array2}; 

और फोन करने वाले विधि में आप के रूप में "obj" लौटे हो जाएगी वस्तु तो

int[] array1 = obj[0] ; 
int[] array2 = obj[1]; 
0

एक Map इस्तेमाल किया जा सकता हो। Map का उपयोग करने का लाभ, कोई भी उतना मूल्य लौटा सकता है जितना वह चाहता है। कोड में इस विचार के कार्यान्वयन है कुछ की तरह -

public Map returnMultipleValues(){ 

Map<String, Object> multiValues = new HashMap<String, Object>(); 
String[] array1 = new String[10]; 
int[] array2 = new int[10]; 

//populate and manipulate these two array 

multiValues.put("array1", array1); 
multiValues.put("array2", array2); 

return multiValue; 

} 

फिर बुला समारोह में आप कुंजियों का उपयोग करके MapmultiValues से इन दो मानों प्राप्त कर सकते हैं - "array1" "array2",:

String[] array1 = (String[]) multiValues.get("array1"); 
int[] array2 = (int[]) multiValues.get("array2"); 
संबंधित मुद्दे