2016-02-16 25 views
5
String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
        "Jupiter", "Saturn", "Uranus", "Neptune" }; 

मेरे पास ग्रह के नामों की एक साधारण सरणी है और मैं सरणी में जोड़े गए प्रत्येक नाम को वापस करना चाहता हूं (स्ट्रिंग ऑर्डर नहीं)।
मैं लैम्ब्डा वाक्य रचना के साथ संघर्ष करने के लिए जारी:एक स्ट्रिंग को रिवर्स करने के लिए लैम्ब्डा अभिव्यक्ति - जावा

Arrays.sort(planets, (first, second) -> new StringBuilder(first).reverse().toString()); 
System.out.println(Arrays.toString(planets)); 

वर्तमान में मैं मिलता है:

Multiple markers at this line

  • The method reverse() in the type StringBuilder is not applicable for the arguments (String)
  • Type mismatch: cannot convert from String to int

प्रतिक्रिया:

आप सभी सुझावों के लिए धन्यवाद ... asList मुझे पास मिला है। मैं अभी भी सही ढंग से सॉर्ट नहीं किया था।

तो मुझे array.sort काम करने के लिए एक रास्ता खोजने की आवश्यकता है क्योंकि यह असाइनमेंट था (array.sort और lambda इसे लेने के लिए)।

मैंने प्रशिक्षक को यहां स्पष्टीकरण मांगने के लिए पिंग किया है, लेकिन मैं समय से बाहर चल रहा हूं।

यहाँ मेरे काम array.sort

  // lambda expression , long to short 
     System.out.println("5) Sorted by length (descending):"); 
     Arrays.sort(planets, (first, second) -> second.length() - first.length()); 
     System.out.println(Arrays.toString(planets)); 

     // lambda expression , reverse the name , then sort in ascending order 
     // hint use new StringBuilder(first).reverse().toString() to reverse the string 
     System.out.println("6) Sorted in dictionary order of the reversed name (ascending)"); 
     Arrays.sort(planets, (first, second) -> new StringBuilder(first).reverse().toString().compareTo(second)); 
     System.out.println(Arrays.toString(planets)); 

     // lambda expression , reverse the name , then sort in descending order 
     System.out.println("7) Sorted in dictionary order of the reversed name (descending)"); 
     Arrays.sort(planets, (first, second) -> new StringBuilder(second).reverse().toString().compareTo(first)); 
     System.out.println(Arrays.toString(planets)); 

रखने के लिए क्या मैं नहीं मेरे जीवन के लिए यहाँ पता लगा सकते हैं कि सभी 3 भाव मुझे बिल्कुल एक ही परिणाम प्राप्त है प्रयास कर रहा है ... उन में से प्रत्येक के लिए देता है मुझे मूल सरणी सबसे कम से कम क्रमबद्ध किया गया।

5) लंबाई के आधार पर छाँटे (उतरते): [नेपच्यून, बुध, बृहस्पति, यूरेनस, शनि, शुक्र, पृथ्वी, मंगल ग्रह]

6) शब्दकोश क्रम में सॉर्ट

यह मेरा परिणाम है उलट नाम की (आरोही) [नेपच्यून, बुध, बृहस्पति, यूरेनस, शनि, शुक्र, पृथ्वी, मंगल ग्रह]

7) (उतरते) [नेपच्यून, बुध, बृहस्पति उलट नाम का शब्दकोश क्रम में सॉर्ट, यूरेनस, शनि, शुक्र, पृथ्वी, मंगल]

+10

तुम क्यों बुला रहे हैं 'Arrays.sort()': इस मामले तो आप बस Arrays.setAll उपयोग कर सकते हैं जगह में सरणी संशोधित करने के लिए? –

+0

मैं Arrays.sort() का उपयोग कर रहा हूं क्योंकि मुझे होमवर्क असाइनमेंट के लिए कहा गया था। –

उत्तर

8

एक वैकल्पिक समाधान है, जिसमें जगह स्ट्रीम एपीआई का उपयोग नहीं करता है और अद्यतन करता है तार:

Arrays.asList(planets).replaceAll(s -> new StringBuilder(s).reverse().toString()); 

डेमो:

String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
     "Jupiter", "Saturn", "Uranus", "Neptune" }; 
Arrays.asList(planets).replaceAll(s -> new StringBuilder(s).reverse().toString()); 
System.out.println(Arrays.toString(planets)); 
// [yrucreM, suneV, htraE, sraM, retipuJ, nrutaS, sunarU, enutpeN] 
+3

'replaceAll()' .. हम्म दिलचस्प दृष्टिकोण .. +1 :) – TheLostMind

4

यह यह तुम्हारे लिए क्या करेंगे:

public static void main(String[] args) { 
    String[] arr = {"earth", "mars", "mercury"}; 
    List<String> ll = Arrays.stream(arr).map(s -> new StringBuilder(s).reverse().toString()).collect(Collectors.toList()); 
    System.out.println(ll); 
} 

ओ/पी:

String[] arr = {"earth", "mars", "mercury"}; 
Arrays.stream(arr).map(s -> new StringBuilder(s).reverse().toString()).forEach(System.out::println); 

ओ/पी:

[htrae, sram, yrucrem] 

या यदि आपने अभी प्रिंट करना चाहते हैं, इस का उपयोग करें:

htrae 
sram 
yrucrem 
+2

यदि आप परिणामों को सीधे 'के लिए' के ​​साथ मुद्रित करने जा रहे हैं, तो आप '.toString()' कॉल को छोड़ सकते हैं ... – Holger

+1

@ होल्गर - हां। सही – TheLostMind

2

Arrays.sort एक दूसरा तर्क के रूप में एक तुलनित्र की आवश्यकता है। इसे लैम्ब्डा अभिव्यक्ति के साथ कार्यान्वित किया जा सकता है जो पैरामीटर (आपके मामले में) के रूप में दो तारों को लेता है और एक पूर्णांक लौटाता है (यह Comparator इंटरफ़ेस में परिभाषित एसएएम की आवश्यकता है)।

(first, second) -> new StringBuilder(first).reverse().toString() 

एक लैम्ब्डा अभिव्यक्ति है कि दो तार (प्रकार संकलक द्वारा मान लिया जाता है) लेता है, लेकिन यह एक स्ट्रिंग और कोई पूर्णांक नहीं है, इसलिए त्रुटि देता है:

java: incompatible types: cannot infer type-variable(s) T 
    (argument mismatch; bad return type in lambda expression 
     java.lang.String cannot be converted to int) 

I have a simple array of planet names and I want to reverse each name that was added to the array

में

Arrays.setAll(planets, i -> new StringBuilder(planets[i]).reverse().toString()); 
+0

तो मेरा कोड यहां है: Arrays.setAll (ग्रह, i -> नया स्ट्रिंगबिल्डर (ग्रह [i])। रिवर्स()। ToString ()); लेकिन मुझे निम्न कोशिश कर रहा है: विधि सेट सभी (स्ट्रिंग [], ( i) -> {}) प्रकार Arrays के लिए अपरिभाषित है –

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