2013-02-18 79 views
9

के साथ नहीं, मैंने एक पुनरावर्ती विधि लिखा है जो स्ट्रिंग में वर्णों से सभी संभावित चरित्र संयोजन प्राप्त करता है।रिकर्सिव विधि जावा में कंसोल के साथ काम करती है, लेकिन एंड्रॉइड

public static void uns(String word, StringBuilder s, List combos) 
{ 
    for(char c: word.toCharArray()) 
    { 
     s.append(c); 
     if(word.length() != 1) 
      { 
      uns(removeChar(word, c),s,combos); 
      } 
     else 
     { 
      combos.add(s.toString()); 
     } 
     s.deleteCharAt(s.toString().length()-1); 
    } 

} 

public static List getCombinations(String word) 
{ 
    List<String> combinations = new ArrayList<String>(); 
    uns(word,new StringBuilder(),combinations); 
    return combinations; 
} 

public static String removeChar(String s, char c) 
{ 
    int index = s.indexOf(c); 
    return s.substring(0,index)+s.substring(index+1); 
} 

जब जावा में यह परीक्षण करते हैं, यह कोई खामियों के साथ भाग गया: मैं भी उस तक पहुँच और कॉम्बो की एक सूची वापस जाने के लिए एक विधि है। किसी कारण से, जब मैं एंड्रॉइड में इसका उपयोग करता हूं, तो सूची तत्वों की सही संख्या के साथ आबादी में होती है, लेकिन प्रत्येक तत्व समान होता है। उदाहरण के लिए, "यहां" शब्द के लिए, यह "eerh" से भरा एक सूची देता है।

+0

'हटाकर()' की परिभाषा क्या है? – Eric

+0

@Eric क्षमा करें, इसे वापस संपादित करने के लिए – Wilson

उत्तर

9

यह एक बहुत ही अजीब गड़बड़ है (निश्चित रूप से पुनरुत्पादित) और आप इस पर एक बग रिपोर्ट दर्ज करना चाहेंगे।

हालांकि, यहां एक अस्थायी कार्यवाही है; .toString() का उपयोग करने के बजाय, जो किसी भी तरह से संदर्भ का पुन: उपयोग करता है (भले ही मैं .substring(0) इसके साथ करता हूं), इसलिए उनमें से सभी अपडेट हो जाते हैं; यदि आप प्रत्येक पुनरावृत्ति के बाद सूची मुद्रित करते हैं, तो आप देखेंगे कि मेरा क्या मतलब है।

यहां मेरा हैकी/अक्षम समाधान है। परिवर्तित करें:

combos.add(s.toString()); 

... करने के लिए:

combos.add(s + ""); 

यह प्रभावी ढंग से स्ट्रिंग ठीक से सरणी में, क्लोन इतना है कि वे चालाकी से नहीं कर रहे हैं:

02-17 19:33:48.605: I/System.out(6502): [Combos]: [here, heer, hree, hree, here, heer, ehre, eher, erhe, ereh, eehr, eerh, rhee, rhee, rehe, reeh, rehe, reeh, ehre, eher, erhe, ereh, eehr, eerh]

+0

+1 संपादित करें * और * समाधान के साथ आ रहा है! –

+1

@ ए - सी मुझे इसे आजमा देना था; मैं इसे अपनी आंखों से देखे बिना विश्वास नहीं कर सका। :) – Eric

+0

@Eric ग्रेट, गहराई से जवाब में। धन्यवाद। – Wilson

0

मैं सकारात्मक नहीं हूं लेकिन मुझे लगता है कि स्ट्रिंग क्लास से valueOf() विधि एस भी काम करेगा। हो सकता है कि स्ट्रिंगबिल्डर के बजाय सूची का उपयोग करने का प्रयास करें, सूची में वर्ण जोड़ें और String.valueOf (s.get (i)) आज़माएं; और वह चरित्र को एक स्ट्रिंग में परिवर्तित करना चाहिए। मुझे नहीं लगता कि एंड्रॉइड में क्यों काम नहीं करेगा लेकिन आपको अपने लूप को थोड़ा संशोधित करने की आवश्यकता हो सकती है। उम्मीद है की वो मदद करदे।

+0

नहीं, 'valueOf() 'के साथ एक ही गड़बड़। मुझे लगता है कि 'String.valueOf (स्ट्रिंगबिल्डर)' केवल 'StringBuilder.toString() 'देता है, जो ओपी के कोड के समान है। – Eric