2015-09-11 36 views
10

का उपयोग कर शब्दों की औसत लंबाई कैसे प्राप्त करें मेरे पास एक शब्द सूची टेक्स्ट फ़ाइल है, मैं उस फ़ाइल से न्यूनतम, औसत और औसत शब्द लंबाई प्राप्त करना चाहता हूं। मैं अधिकतम मुद्रण कर रहा हूँ और न्यूनतमLambda Expression

System.out.println(readWords(filename) 
     .min(Comparator.comparing(s -> s.length())) 
     .get() 
     .length() 
); 
System.out.println(readWords(filename) 
     .max(Comparator.comparing(s -> s.length())) 
     .get() 
     .length() 
); 

यह काम करता है के रूप में उम्मीद के परीक्षण के लिए अपने मुख्य विधि में

public static Stream<String> readWords(String filename) { 
    try { 
     BufferedReader reader = new BufferedReader(new FileReader(filename)); 
     Stream<String> stringStream = reader.lines(); 
     return stringStream; 
    } catch (IOException exn) { 
     return Stream.<String>empty(); 
    } 
} 

:

मैं एक धारा विधि है।

सवाल:
यह है कि मैं न्यूनतम और अधिकतम में किया था शब्द लंबाई के औसत पाने के लिए संभव है? दोनों मामलों में हां या नहीं, यह कैसे करें (केवल लैम्ब्डा अभिव्यक्ति के रूप में)?

+0

आप .reduce (0, (i, c) -> c + i.length()) का उपयोग कर सकते हैं और इसे लाइनों की मात्रा से विभाजित कर सकते हैं। –

+0

संकेत: यदि आपकी फ़ाइल वास्तव में बड़ी है और –

+0

@JoshuaK को कम करने के बजाय बहुत सारी लाइनें एकत्रित होती हैं तो आपके योगदान के लिए भी धन्यवाद, मुझे –

उत्तर

13

lines() विधि आपको लाइनों की एक धारा मिलेगी, न कि शब्द। एक बार जब आप Stream है, शब्दों के साथ लाइनों को बदलने के लिए, लैम्ब्डा अभिव्यक्ति की आपूर्ति शब्द बाहर विभाजित करने के लिए फोन flatMap:

Stream<String> stringStream = reader.lines().flatMap(line -> 
    Stream.of(line.split("\\s+")) 
); 

यह max और min अपने क्रियान्वयन की सही कर देंगे। यह किसी भी औसत गणना की शुद्धता को भी प्रभावित करता है जिसे आप कार्यान्वित करना चाहते हैं।

औसत निकालने के लिए, आप mapToInt उनकी लंबाई (एक IntStream उपज) के लिए शब्दों की धारा मैप करने के लिए कॉल कर सकते हैं, तो average है, जो एक OptionalDouble रिटर्न कहते हैं।

System.out.println(readWords(filename) 
    .mapToInt(s -> s.length()) // or .mapToInt(String::length) 
    .average() 
    .getAsDouble()); 
+0

से नीचे का जवाब क्यों मिला है 11 क्यों होना चाहिए? –

+0

यह थंप अप करता है, और मुझे .flatMap आदि के बारे में आपका इनपुट पसंद है –

+3

'सारांश सांख्यिकी() '- https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream के बारे में .html # सारांश सांख्यिकी - – ZhongYu

6

आधिकारिक दस्तावेज के बारे में reductions

System.out.println(readWords(filename) 
       .mapToInt(String::length) 
       .average() 
       .getAsDouble() 
); 

ध्यान दें कि आप और शायद की तरह String::length

+0

आपका कोड बहुत बड़ा काम करता है मैंने स्ट्रीम इनपुट के कारण अन्य उत्तर चुना है, आपका उत्तर भी मान्य है। –

+0

मैंने उसी कारण से rgettman का जवाब उभारा :-) धन्यवाद –

7

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

IntSummaryStatistics summary = readWords(filename) 
    .collect(Collectors.summarizingInt(String::length)); 
System.out.format("min = %d, max = %d, average = %.2f%n", 
    summary.getMin(), summary.getMax(), summary.getAverage()); 
+1

धन्यवाद यह काम करता है और साथ ही इसका परीक्षण भी करता है। अच्छा है –

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